linq .Value Nullable Object必须具有值.怎么跳?

Smi*_*thy 8 c# linq

我有一些linq代码,有时候null:

        cbo3.ItemsSource = empty.Union(from a in
                                           (from b in CompleteData
                                            select b.TourOpID).Distinct()
                                       select new ComboBoxItemString() { ValueString = a.Value.ToString() });
Run Code Online (Sandbox Code Playgroud)

TourOpID有时会null抛出错误a.Value.ToString().我该如何解决这个问题?

Hei*_*nzi 18

因为您访问出现此问题Value属性一个的Nullable类型,是null(或者,更准确地说,它的HasValue性质是false).如何解决这个问题取决于你想要做什么:

  1. 如果要过滤掉TourOpIDnull的项,只需添加一个where子句:

    ...
    (from b in CompleteData
     where b.TourOpID != null         // filter
     select b.TourOpID).Distinct()
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果要使用替换值,例如0if TourOpID为null,请使用null coalescing运算符 ??,该运算符将您int?转换为int:

    ...
    (from b in CompleteData
     select b.TourOpID ?? 0).Distinct()
    ...
    
    Run Code Online (Sandbox Code Playgroud)

    或者,或者,

    ...
    select new ComboBoxItemString() { ValueString = a.GetValueOrDefault().ToString() });
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果您只想显示一个不同的ComboBox条目,如果TourOpID为null,请使用三元运算符?::

    ...
    select new ComboBoxItemString() { 
        ValueString = (a == null ? "no tour operator" : a.Value.ToString())
    });
    
    Run Code Online (Sandbox Code Playgroud)

    如果要显示空字符串,如果a为null,则解决方案更简单:

    ...
    select new ComboBoxItemString() { ValueString = a.ToString() });
    
    Run Code Online (Sandbox Code Playgroud)

    因为Nullable.ToString返回一个空字符串,如果它没有值.

  • 到目前为止最佳答案.+1. (3认同)