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

时间:2009-11-30 22:10:24

标签: c# linq lambda ienumerable

我正在使用以下语句,目的是获取MachineList集合(类型IEnumerable)中具有MachineStatus i 的所有计算机对象。 MachineList集合并不总是包含状态为 i 的计算机。

当没有机器有MachineStatus 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的后续枚举抛出异常:Object reference not set to an instance of an object

因此,如果调用ActiveMachinesInactiveMachines作为MachineList集合的问题,则无关紧要。这尤其令人不安,因为我可以通过在代码中调用它之前在Watch中枚举它来中断对MachineList的调用。在最低级MachineList实现NHibernate.IQuery作为IEnumerable返回。什么导致MachineList在初始枚举后丢失其内容?

3 个答案:

答案 0 :(得分:7)

如果没有匹配项,

Where将返回一个空序列;这是一个完全有效的序列(非空)。如果您拨打FirstOrDefaultSingleOrDefault,则唯一可以获得空的方式。

你确定错误是你认为的吗?

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

答案 1 :(得分:4)

默认情况下,Enumerable.Where已经返回空IEnumerable<T>,而不是空。如果您看到“对象引用未设置为对象的实例”。例外,最有可能的是其他问题。

也许是MachineList为空?如果您尚未创建,则在致电.Where(...)

时会收到该例外情况

答案 2 :(得分:2)

此外,如果您希望显式返回空集合,这可以帮助...

Enumerable.Empty<Machine>();