linq . value可空对象必须有一个值.如何跳过
本文关键字:有一个 何跳过 value 对象 linq | 更新日期: 2023-09-27 18:14:29
我有一些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()
抛出错误。怎么解呢?
出现问题是因为您访问了Nullable
类型的Value
属性,该属性为null
(或者更准确地说,其HasValue
属性为false
)。如何解决这个问题取决于你想做什么:
-
如果您想过滤掉
TourOpID
为null的项目,只需添加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
为null时显示不同的ComboBox条目,请使用三元运算符?:
:... select new ComboBoxItemString() { ValueString = (a == null ? "no tour operator" : a.Value.ToString()) });
如果您想在
a
为null时显示空字符串,解决方案甚至更简单:... select new ComboBoxItemString() { ValueString = a.ToString() });
因为可以为空。如果ToString没有值,则返回空字符串。
使用where
from b in CompleteData where b.TourOpID != null select b.TourOpID
为什么不直接用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