2011-07-21 71 views
3
results.Where(x=>x.Members.Any(y=>members.Contains(y.Name.ToLower()) 

我偶然在互聯網上看到這個查詢。任何人都可以解釋這個問題。請解釋下面的Linq Query?

爲這個新手建議我一個很好的LINQ教程。

謝謝大家。

編輯:

這是什麼x和y代表?

回答

3
  • x處於results序列中的元素的類型的單個結果。
  • y是單個成員,它是x.Members序列中元素的類型。

這些是λ表達式(x => x.whatever)引入的語言與C#3,其中x是輸入的是,和右側(x.whatever)是輸出(在該特定使用場景)。

一種更容易的例子

var list = new List<int> { 1, 2, 3 }; 
var oddNumbers = list.Where(i => i % 2 != 0); 

這裏,i是單int項目作爲輸入到表達。 i % 2 != 0是一個布爾表達式,用於評估輸入是偶數還是奇數。整個表達式(i => i % 2 != 0)是一個謂詞,Func<int, bool>,其中輸入是整數,輸出是布爾值。跟隨?在迭代查詢oddNumbers時,list序列中的每個元素都將針對謂詞進行評估。那些通過然後成爲你的輸出的一部分。

foreach (var item in oddNumbers) 
    Console.WriteLine(item); 

// writes 1, 3 
+0

很好的例子... – user787788

1

有趣的查詢,但我不喜歡它。

我會先回答你的第二個問題。 xy是在對Where()Any()的調用中定義的lambda方法的參數。你可以輕鬆更改名稱要有意義的多:

results.Where(result => 
    result.Members.Any(member => members.Contains(member.Name.ToLower()); 

並回答你的第一個問題,這個查詢將在results返回的每個項目,其中Members集合有也包含在Members集合中的至少一個項目作爲小寫字符串。

在知道Members集合是什麼或它擁有什麼的情況下,邏輯對我來說並沒有什麼意義。

0

x將成爲結果集合的每個實例。該查詢使用lambda語法,所以x => x。 somemember的意思是「在每個傳入的x上調用somemember。在哪裏是一個IEnumerables的擴展方法,它需要一個函數接受一個參數並返回一個布爾值.Lambda語法創建代表下的代表,但是更具表達性某些類型的操作(並節省大量打字)。如果不知道結果集合中保存的對象的類型(結果將實現IEnumerable),那麼很難確切知道上面的代碼將執行什麼操作。但一個受過教育的猜測是,它將檢查上述集合中所有x的所有成員,並返回一個僅包含所有小寫名稱的成員的IEnumerable。