2009-11-30 121 views
6

我使用下面的語句,讓所有從MachineList集合(IEnumerable類型)機器對象的意圖有MachineStatusMachineList系列並不總是包含狀態爲i的機器。返回一個空集時,LINQ的地方沒有返回

當沒有機器有MachineStatusi我想返回一個空集合。我致電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後續枚舉拋出exeception進一步檢查:Object reference not set to an instance of an object

因此,撥打ActiveMachinesInactiveMachines作爲MachineList集合的問題時,無關緊要。這特別令人煩惱,因爲我可以在調用代碼之前簡單地通過在Watch中枚舉來打斷MachineList。在其最低級MachineList實施NHibernate.IQuery作爲IEnumerable返回。導致MachineList在初始枚舉後失去內容的原因是什麼?

+0

沒,沒什麼枚舉時發生特殊情況;看看調試器中的「不活動」等是很有趣的。我還想知道(例如)'MachineStatus'是否是一個拋出異常的facade屬性 - 即'public string MachineStatus {get {return someInnerField.Status;}}'someInnerField'是'null'。 – 2009-11-30 23:05:49

+0

真正的問題是你多次枚舉一個'IEnumerable'。您在使用「IEnumerable」時同意的隱式合約僅列舉一次!所以真正的答案不是讓你的同事改變他的代碼以允許多次枚舉,而是讓你在某個時間點執行'Customer.MachineList.ToList()',然後只使用結果列表(或者,新的IEnumerable')。你可以做懶惰評估;你可以緩存它,但不要枚舉它兩次。你也可以暴露一個'IQueryable'並且多次調用它。 – ErikE 2015-10-27 18:00:41

回答

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 
+0

這就是我的想法。我修改了我的問題以反映引發相同錯誤的修改。 – ahsteele 2009-11-30 22:25:05

+0

在我的問題中增加了一些附加信息,可能會對發生的事情有所瞭解。也就是說,我想我可能會需要打開一個新線程。 – ahsteele 2009-12-01 06:54:49

+0

錯誤必須以MachineList的構建方式進行。我一直在使用另一個開發人員的這種方法,並沒有檢查它正在建立的方式。感謝您通過詢問我是否確定我在正確的位置尋找正確的方向來指引我。 – ahsteele 2009-12-02 19:14:32

4

默認情況下,Enumerable.Where已經做返回一個空IEnumerable<T>,不爲空。如果您看到「對象引用未設置爲對象的實例」。例外情況,這很可能是其他問題。

MachineList是空的,也許?如果你沒有創造它,你會得到這個異常上您的來電.Where(...)

+0

感謝您通過詢問我是否確定我在正確的位置尋找正確的方向。 – ahsteele 2009-12-02 19:22:48

2

此外,如果你想明確地返回一個空的集合,這可以幫助...

Enumerable.Empty<Machine>();