10

我有一些 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有时会nulla.Value.ToString(). 我该如何解决这个问题?

4

3 回答 3

18

出现问题是因为您访问的类型的Value属性是(或者更准确地说,其属性是)。如何解决此问题取决于您要执行的操作:NullablenullHasValuefalse

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

    ...
    (from b in CompleteData
     where b.TourOpID != null         // filter
     select b.TourOpID).Distinct()
    ...
    
  2. 如果您想使用替换值,例如0,如果TourOpID为 null,请使用null 合并运算符 ??,它将您int?转换为int

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

    或者,或者,

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

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

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

    ...
    select new ComboBoxItemString() { ValueString = a.ToString() });
    

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

于 2013-05-19T10:55:07.423 回答
1

采用where

from b in CompleteData where b.TourOpID != null select b.TourOpID
于 2013-05-19T10:50:23.557 回答
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
于 2013-05-19T11:08:09.090 回答