2012-07-19 57 views
6

我想將此代碼轉換爲linq解決方案。它的功能是查看一批客戶,並查看是否至少有一箇中間名。此代碼工作正常,我只是想學習LINQ,所以尋找一個替代的解決方案:集合中的第一個匹配

//Customers - List<Customer> 
private bool checkMiddleName() 
{ 
    foreach (Customer i in Customers) 
    { 
     if (i.HasMiddleName == true) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

我試着寫類似:(Customers.Foreach(x=>x.HasMiddleName==true)... 但看起來線它不是我要找的方法。

+0

僅供參考 - 上列出的ForEach方法只執行給定的功能列表 – cordialgerm 2012-07-19 22:40:14

回答

18

如果你只是想知道,如果那裏有至少一個,你可以使用Enumerable.Any

bool atLeastOneCustomerWithMiddleName = Customers.Any(c => c.HasMiddleName); 

如果您想知道第一個匹配的客戶Tomer的,你可以使用Enumerable.FirstEnumerable.FirstOrDefault找到第一個客戶與MiddleName==true

var customer = Customers.FirstOrDefault(c => c.HasMiddleName); 
if(customer != null) 
{ 
    // there is at least one customer with HasMiddleName == true 
} 

First引發InvalidOperationException如果源序列是空的,而FirstOrDefault回報null如果沒有匹配。

+0

任何方式從查詢返回true或false? – user194076 2012-07-19 22:34:58

+0

@ user194076:如果您想檢查是否有一位匹配的客戶,可以使用「任意」。編輯我的答案。 – 2012-07-19 22:37:41

1

在此基礎上:

它所做的看起來成客戶的集合,看看的至少一個有一箇中間名。

嘗試

return Customers.Where(x => x.HasMiddleName).Any(); 

該查詢返回true如果至少一個custmer擁有財產HasMiddleName = true

+1

尼斯的每個成員 - 任何就是我一直在尋找。謝謝! – user194076 2012-07-19 22:36:11

+6

'Any'需要一個謂詞,所以你可以縮短這個'return Customers.Any(x => x.HasMiddleName);' – 2012-07-19 22:39:05

2
var result = Customers.Where(x=>x.HasMiddleName == true).FirstOrDefault(); 
0

您可以使用以下方法來達到你需要的東西:

Customers.Where(cust=> cust.HasMiddleName).Count > 0 

所以,如果計數大於零意味着你有一些客戶誰擁有中間名。

或者有更好的表現你會說:

bool customerWithMiddleName; 

foreach(Customer cust in Customers) 
{ 
    if(cust.HasMiddleName) 
    { 
    customerWithMiddleName = true; 
    break; 
    } 
} 
+1

這不是一個好主意,因爲它執行整個查詢,只知道是否有一個匹配元素。考慮到客戶包含1000000個客戶,並且第一個具有中間名。任何(cust => cust.HasMiddleName)'會立即返回'true',而你的方法會在返回之前檢查每個元素。 – 2012-07-19 22:42:08

+2

這需要代碼來計算有多少正確的項目,而不是第一次找到匹配時進行短路。這可能是不必要的昂貴。最好使用.Any()。 – StriplingWarrior 2012-07-19 22:43:30