Вы можете использовать itertools.chain()
:
>>> import itertools
>>> list2d = [[1,2,3],[4,5,6], [7], [8,9]]
>>> merged = list(itertools.chain(*list2d))
или, на Python> = 2.6, использовать itertools.chain.from_iterable()
, который не требуется распаковать список:
>>> import itertools
>>> list2d = [[1,2,3],[4,5,6], [7], [8,9]]
>>> merged = list(itertools.chain.from_iterable(list2d))
Этот подход, возможно, более читабельен, чем [item for sublist in l for item in sublist]
, и, похоже, работает быстрее:
[me@home]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99;import itertools' 'list(itertools.chain.from_iterable(l))'
10000 loops, best of 3: 24.2 usec per loop
[me@home]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' '[item for sublist in l for item in sublist]'
10000 loops, best of 3: 45.2 usec per loop
[me@home]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'sum(l, [])'
1000 loops, best of 3: 488 usec per loop
[me@home]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'reduce(lambda x,y: x+y,l)'
1000 loops, best of 3: 522 usec per loop
[me@home]$ python --version
Python 2.7.3
Проблема возникает из-за того, что условный оператор не смотрит, как это значение используется (назначается в этом случае), чтобы определить тип выражения - только значения true / false. В этом случае у вас есть null и Int32, и тип не может быть определен (есть реальные причины, по которым он не может просто принять Nullable & lt; Int32 & gt;).
Если вы действительно хотите использовать его таким образом, вы должны указать одно из значений в Nullable & lt; Int32 & gt; самостоятельно, поэтому C # может разрешить тип:
EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
? (int?)null
: Convert.ToInt32(employeeNumberTextBox.Text),
или
EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
? null
: (int?)Convert.ToInt32(employeeNumberTextBox.Text),
Вы можете вывести вывод Convert:
EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text)
? null
: (int?)Convert.ToInt32(employeeNumberTextBox.Text)
//Some operation to populate Posid.I am not interested in zero or null
int? Posid = SvcClient.GetHolidayCount(xDateFrom.Value.Date,xDateTo.Value.Date).Response;
var x1 = (Posid.HasValue && Posid.Value > 0) ? (int?)Posid.Value : null;
EDIT: Краткое объяснение выше, я пытался получить значение Posid
(если его nonnull int
и имеющий значение больше 0) в varibale X1
. Я должен был использовать (int?)
на Posid.Value
, чтобы оператор условности не выдавал ошибку компиляции. Просто FYI GetHolidayCount
- это метод WCF
, который может дать null
или любое число. Надеюсь, что это поможет
Я думаю, что полезный метод мог бы помочь сделать этот чист.
public static class Convert
{
public static T? To<T>(string value, Converter<string, T> converter) where T: struct
{
return string.IsNullOrEmpty(value) ? null : (T?)converter(value);
}
}
, затем
EmployeeNumber = Convert.To<int>(employeeNumberTextBox.Text, Int32.Parse);
Хотя Алекс дает правильный и проксимальный ответ на ваш вопрос, я предпочитаю использовать TryParse
:
int value;
int? EmployeeNumber = int.TryParse(employeeNumberTextBox.Text, out value)
? (int?)value
: null;
. Он безопаснее и заботится о случаях недействительного ввода, а также о пустом строковом сценарии , В противном случае, если пользователь вводит что-то вроде 1b
, им будет представлена страница с ошибкой с необработанным исключением, вызванным в Convert.ToInt32(string)
.