C# linq.Value Nullable对象必须有一个值。如何跳过?

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

我有一些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()上抛出错误。如何解决此问题?

使用
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