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

时间:2013-05-19 10:46:04

标签: 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() });

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

3 个答案:

答案 0 :(得分:17)

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

  1. 如果要过滤掉TourOpID为空的项目,只需添加where子句:

    ...
    (from b in CompleteData
     where b.TourOpID != null         // filter
     select b.TourOpID).Distinct()
    ...
    
  2. 如果您想使用替换值,例如0,如果TourOpID为空,请使用null coalescing operator ??,将int?转换为int

    ...
    (from b in CompleteData
     select b.TourOpID ?? 0).Distinct()
    ...
    

    或者,

    ...
    select new ComboBoxItemString() { ValueString = a.GetValueOrDefault().ToString() });
    
  3. 如果您只想在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