C# linq.Value Nullable对象必须有一个值。如何跳过?
我有一些linq代码,有时C# linq.Value Nullable对象必须有一个值。如何跳过?,c#,linq,C#,Linq,我有一些linq代码,有时null: cbo3.ItemsSource = empty.Union(from a in (from b in CompleteData select b.TourOpID).Distinct() se
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()上抛出错误。如何解决此问题?使用where
from b in CompleteData where b.TourOpID != null select b.TourOpID
出现此问题是因为您访问了null
类型的属性,该类型为null
(或者更准确地说,其HasValue
属性为false
)。如何解决此问题取决于您要执行的操作:
如果要筛选出TourOpID
为空的项目,只需添加where
子句:
...
(from b in CompleteData
where b.TourOpID != null // filter
select b.TourOpID).Distinct()
...
如果要使用替换值,例如0
,如果TourOpID
为空,请使用??
,它将int?
转换为int
:
...
(from b in CompleteData
select b.TourOpID ?? 0).Distinct()
...
或者,或者
...
select new ComboBoxItemString() { ValueString = a.GetValueOrDefault().ToString() });
如果您只想在TourOpID
为空时显示不同的组合框条目,请使用三元运算符?:
:
...
select new ComboBoxItemString() {
ValueString = (a == null ? "no tour operator" : a.Value.ToString())
});
如果希望在a
为null时显示空字符串,则解决方案更简单:
...
select new ComboBoxItemString() { ValueString = a.ToString() });
如果没有值,则返回空字符串
为什么不直接使用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