当Linq没有返回时返回一个空集合
我正在使用以下语句,目的是从MachineList
集合(类型IEnumerable)获取具有i的MachineStatus
的所有机器对象。 MachineList
集合不会始终包含状态为i的计算机 。
有时没有机器有我的MachineStatus
我想要返回一个空集合。 我对ActiveMachines
(首先使用)的调用有效但InactiveMachines
没有。
public IEnumerable ActiveMachines { get { return Customer.MachineList .Where(m => m.MachineStatus == "a"); } } public IEnumerable InactiveMachines { get { return Customer.MachineList .Where(m => m.MachineStatus == "i"); } }
编辑
经过进一步检查,似乎MachineList
任何枚举都会导致MachineList
后续枚举抛出exception: Object reference not set to an instance of an object
。
因此,调用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
默认情况下, Enumerable.Where已经返回一个空的IEnumerable
,而不是null。 如果您看到“对象引用未设置为对象的实例”。 例外,最有可能的是其他问题。
可能是MachineList为null吗? 如果您还没有创建它,那么您在调用.Where(...)
会遇到exception
此外,如果您希望显式返回空集合,这可以帮助…
Enumerable.Empty();