results.Where(x=>x.Members.Any(y=>members.Contains(y.Name.ToLower())
我偶然在互聯網上看到這個查詢。任何人都可以解釋這個問題。請解釋下面的Linq Query?
爲這個新手建議我一個很好的LINQ教程。
謝謝大家。
編輯:
這是什麼x和y代表?
results.Where(x=>x.Members.Any(y=>members.Contains(y.Name.ToLower())
我偶然在互聯網上看到這個查詢。任何人都可以解釋這個問題。請解釋下面的Linq Query?
爲這個新手建議我一個很好的LINQ教程。
謝謝大家。
編輯:
這是什麼x和y代表?
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
它的一個lambda expression。 Here是一個偉大的LINQ教程
有趣的查詢,但我不喜歡它。
我會先回答你的第二個問題。 x
和y
是在對Where()
和Any()
的調用中定義的lambda方法的參數。你可以輕鬆更改名稱要有意義的多:
results.Where(result =>
result.Members.Any(member => members.Contains(member.Name.ToLower());
並回答你的第一個問題,這個查詢將在results
返回的每個項目,其中Members
集合有也包含在Members
集合中的至少一個項目作爲小寫字符串。
在知道Members
集合是什麼或它擁有什麼的情況下,邏輯對我來說並沒有什麼意義。
x將成爲結果集合的每個實例。該查詢使用lambda語法,所以x => x。 somemember的意思是「在每個傳入的x上調用somemember。在哪裏是一個IEnumerables的擴展方法,它需要一個函數接受一個參數並返回一個布爾值.Lambda語法創建代表下的代表,但是更具表達性某些類型的操作(並節省大量打字)。如果不知道結果集合中保存的對象的類型(結果將實現IEnumerable),那麼很難確切知道上面的代碼將執行什麼操作。但一個受過教育的猜測是,它將檢查上述集合中所有x的所有成員,並返回一個僅包含所有小寫名稱的成員的IEnumerable。
很好的例子... – user787788