我有一些linq代码,有时是null
:
cbo3.ItemsSource = empty.Union(from a in
(from b in CompleteData
select b.TourOpID).Distinct()
select new ComboBoxItemString() { ValueString = a.Value.ToString() });
但TourOpID
有时null
会在a.Value.ToString()
上抛出错误。我该如何解决这个问题?
答案 0 :(得分:17)
出现此问题是因为您访问的Nullable
类型的Value
property是null
(或者更准确地说,其HasValue
属性为false
) 。如何解决这个问题取决于你想做什么:
如果要过滤掉TourOpID
为空的项目,只需添加where
子句:
...
(from b in CompleteData
where b.TourOpID != null // filter
select b.TourOpID).Distinct()
...
如果您想使用替换值,例如0
,如果TourOpID
为空,请使用null coalescing operator ??
,将int?
转换为int
:
...
(from b in CompleteData
select b.TourOpID ?? 0).Distinct()
...
或者,
...
select new ComboBoxItemString() { ValueString = a.GetValueOrDefault().ToString() });
如果您只想在TourOpID
为空时显示不同的ComboBox条目,请使用三元运算符?:
:
...
select new ComboBoxItemString() {
ValueString = (a == null ? "no tour operator" : a.Value.ToString())
});
如果要在a
为空时显示空字符串,则解决方案更简单:
...
select new ComboBoxItemString() { ValueString = a.ToString() });
因为Nullable.ToString如果没有值,则返回一个空字符串。
答案 1 :(得分:1)
使用where
from b in CompleteData where b.TourOpID != null select b.TourOpID
答案 2 :(得分:1)
为什么不使用ValueString = a.ToString()
代替ValueString = a.Value.ToString()
。如果a
有值,则会将此值返回给字符串,否则 - a.ToString()
将返回空字符串。
IEnumerable<decimal?> arr = new List<decimal?>
{
1m, 4m, null, 10m, 6m
};
foreach (var @decimal in arr)
{
Console.WriteLine(@decimal.ToString());
}
输出结果为:
1
4
10
6