我正在使用以下语句,目的是获取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
。
因此,如果调用ActiveMachines
或InactiveMachines
作为MachineList
集合的问题,则无关紧要。这尤其令人不安,因为我可以通过在代码中调用它之前在Watch中枚举它来中断对MachineList
的调用。在最低级MachineList
实现NHibernate.IQuery
作为IEnumerable
返回。什么导致MachineList
在初始枚举后丢失其内容?
答案 0 :(得分:7)
Where
将返回一个空序列;这是一个完全有效的序列(非空)。如果您拨打FirstOrDefault
或SingleOrDefault
,则唯一可以获得空的方式。
你确定错误是你认为的吗?
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>();