2012-05-14 55 views
1

我遇到一些麻煩LINQ查詢LINQ檢索列表中的

var matches = from po in purchaseOrders 
      from poItem in po.Items 
      where TestMatch(poItem) 
      select new Item(poItem); 

purchaseOrders中是列出每個項目第一個匹配項,或爲空值 每個PurchaseOrder的包含列表

我需要的結果是每個採購訂單中匹配的第一個項目(基於TestMatch(poItem)的結果),或者是一個空白項目對象。

因此,在年底matches.Count == purchaseOrders.Count

目前,我只得到匹配的PO這一點,我不知道如何保證我只是每PO獲得一個項目的項目。而且我不知道如何確保沒有匹配,我得到該PO的空白項目。

+0

你可能包括'TestMatch'功能也 – Magnus

+0

@Magnus,這不需要回答,Jon Skeet已經找到了解決方案。 – CaffGeek

+0

是的,但我認爲TestMatch中的某種左連接可能會給你更好的表現 – Magnus

回答

4

這聽起來像你想要的東西,如:

var matches = from po in purchaseOrders 
       let poItem = po.Items.FirstOrDefault(item => TestMatch(item)) 
       select new { PO = po, 
          Item = poItem == null ? null : new Item(poItem) }; 

用C#4你可以使用一個方法組轉換爲參數FirstOrDefault:

var matches = from po in purchaseOrders 
       let poItem = po.Items.FirstOrDefault(TestMatch(item) 
       select new { PO = po, 
          Item = poItem == null ? null : new Item(poItem) }; 
+0

我從來沒有想過將條件移入let子句。優秀! – CaffGeek

+0

@ po.Items.Where(poItem => TestMatch(poItem))。FirstOrDefault()'可以寫成'po.Items.FirstOrDefault(TestMatch)' – Firo

+0

@Firo:同意使用謂詞形式。 (已編輯)。是否可以使用方法組轉換可能取決於您使用的C#編譯器的版本。在C#4中改進了類型推斷。 –