加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 当Linq没有返回时返回一个空集合

发布时间:2020-12-15 18:27:58 所属栏目:百科 来源:网络整理
导读:我正在使用以下语句,目的是从MachineList集合(类型IEnumerable)获取具有i的MachineStatus的所有机器对象. MachineList集合并不总是包含状态为i的计算机. 有时没有机器的机器状态我想要返回一个空集合.我对ActiveMachines(首先使用)的调用有效,但InactiveMach
我正在使用以下语句,目的是从MachineList集合(类型IEnumerable)获取具有i的MachineStatus的所有机器对象. MachineList集合并不总是包含状态为i的计算机.

有时没有机器的机器状态我想要返回一个空集合.我对ActiveMachines(首先使用)的调用有效,但InactiveMachines没有.

public IEnumerable<Machine> ActiveMachines
{
    get
    {
        return Customer.MachineList
            .Where(m => m.MachineStatus == "a");
    }
}

public IEnumerable<Machine> InactiveMachines
{
    get
    {
        return Customer.MachineList
            .Where(m => m.MachineStatus == "i");
    }
}

编辑

经过进一步检查,似乎MachineList的任何枚举都会导致MachineList的后续枚举抛出异常:对象引用未设置为对象的实例.

因此,调用ActiveMachines或InactiveMachines作为MachineList集合的问题并不重要.这尤其令人不安,因为我可以通过在Watch中调用它来调用MachineList,然后再在代码中调用它.在最低级别,MachineList实现了NHibernate.IQuery作为IEnumerable返回.什么导致MachineList在初始枚举后丢失其内容?

解决方法

如果没有匹配则返回空序列;这是一个完全有效的序列(非空).获得null的唯一方法是调用FirstOrDefault或SingleOrDefault.

你确定这个bug是你认为的吗?

int?[] nums = { 1,3,5 };
var qry = nums.Where(i => i % 2 == 0);
Console.WriteLine(qry == null); // false
Console.WriteLine(qry.Count()); // 0
var list = qry.ToList();
Console.WriteLine(list.Count); // 0
var first = qry.FirstOrDefault();
Console.WriteLine(first == null); // true

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读