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有时是nulla.Value.ToString()抛出错误。怎么解呢?

linq . value可空对象必须有一个值.如何跳过

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

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

    ...
    (from b in CompleteData
     where b.TourOpID != null         // filter
     select b.TourOpID).Distinct()
    ...
    
  2. 如果您想使用替换值,例如0,如果TourOpID为空,则使用空合并运算符??,该运算符将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())
    });
    

    如果您想在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