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

ahs*_*ele 6 c# linq ienumerable lambda

我使用下面的语句让所有的计算机对象从的意图MachineList集合(IEnumerable类型),其具有MachineStatus.该MachineList集合不会始终包含状态为i的计算机.

有时,当没有机器有一个MachineStatus我想返回一个空的集合.我的呼叫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");
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

经过进一步审查,似乎任何枚举MachineList都会导致后续的枚举MachineList抛出:Object reference not set to an instance of an object.

因此,无论是对集合进行调用ActiveMachines还是InactiveMachines作为MachineList集合的问题都无关紧要.这尤其令人不安,因为我可以MachineList在调用代码之前通过在Watch中枚举调用来中断调用.在最低级别MachineList实现NHibernate.IQuery作为一个返回IEnumerable.MachineList最初的枚举后导致丢失内容的原因是什么?

Mar*_*ell 7

Where如果没有匹配则返回空序列; 这是一个完全有效的序列(非空).你得到一个空的唯一方法是你打电话FirstOrDefaultSingleOrDefault.

你确定这个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
Run Code Online (Sandbox Code Playgroud)