2010-02-10 244 views
5

這裏有兩個C#類...這個LINQ查詢做了什麼?

public class Address 
{ 
    public string Country; 
    public string City; 
} 

public class Traveller 
{  
    public string Name; 
    public List<Address> TravelRoute; 
} 

...和數據(的地方填寫)列表...

List<Traveller> Travellers; 

...然後這個LINQ查詢:

var result = from t in Travellers 
      where t.TravelRoute.Any(a => a.Country == "F") 
      select t; 

foreach (var t in result) 
    System.Console.WriteLine(t.Name); 

我不明白查詢:什麼意思是「任何」功能和「=>」運算符是做什麼的?

有人能解釋我在這段代碼中發生了什麼嗎?謝謝!

回答

1

 
a => a.Country == "F" 

將轉化爲這樣的事情,如果它是一個分離的LINQ聲明:

 
From a as Adress in t.TravelRoute 
Where a.Country = "F" 
Select a 

的任何意味着:任何。 換句話說,它將如果任何travelRoute對象都有其國家屬性返回true,以「F」

希望幫助

+0

那麼,這是否意味着這個「lambda表達式」僅僅是另一個「嵌套」LINQ查詢的縮寫?只有寫代碼更緊湊的東西? – Slauma 2010-02-10 20:43:39

+0

Lambda表達式也稱爲內聯表達式,通常是爲一次性函數編寫的,通常更緊湊。您不必爲參數指定類型,因爲它會推導出它。我想說的是,你可以用一個嵌套的LINQ代替它,但是我不知道LINQ足以說寫我在另一個LINQ中編寫的LINQ將會像這樣工作。 – 2010-02-10 21:24:11

+0

更準確地說,lambda表達式也可以轉換爲LINQ提供程序用來轉換爲其他代碼片段(如SQL表達式)的表達式樹。 – 2010-02-11 08:25:01

7

它選擇TravelRoute包含一個國家爲「F」的所有旅客。

如果列表中的任何對象滿足傳入該函數的條件,則Any函數返回true。從方法簽名中,您可以看到需要返回boolFunc<>委託。這意味着它會採用任何方法返回一個布爾值,包括提供的lambda表達式。

這是從Where不同,這將根據被傳遞的狀態進行過濾。

的=>是一個lambda expression。在這種特殊情況下,這是編寫anonymous delegate的捷徑。

+3

這也許值得指出的是'Any'是對口'All' ;當*集合中的每個*元素都滿足條件(本質上是一長串'和'語句)和短路到'false'時,All'返回true,而任何*元素在* any *元素時返回true的集合滿足條件(基本上是一串長長的「或」語句)和通過時「真實」的短路。 – 2010-02-10 20:30:25

+0

我不認爲這表示正確。'where'關鍵字選擇滿足條件的任何對象,在這種情況下,條件是應至少有一個謂詞返回true的TravelRoute。我認爲重要的是要注意其中的差異。 – 2010-02-10 20:37:02

+0

感謝亞當,這個「任何」的解釋都很清楚! – Slauma 2010-02-10 20:39:09

0

任何一種過濾方法都會顯示「接受符合以下條件的任何項目」。 a => ...業務的意思是「給定一個參數a,這裏是一個方法」 - 正如其他人所說的那樣,它用於lambda表達式。 編輯:改變「屬性」爲「參數」

+0

編譯器如何知道參數a是什麼類型?該類型沒有指定,只有一個。但我甚至得到了Intellisense,它爲我提供了國家成員。它很好也很正確,但很難理解...... – Slauma 2010-02-10 20:32:54

+0

Lambda表達式在語法上通常是神祕的,但體積小而且高效。 – 2010-02-10 21:27:19

+0

編譯器通常可以通過您如何使用它來推斷類型。在這種情況下,Any()函數的簽名需要一個類型爲Func 的參數,這意味着它需要一個接受字符串並返回bool(一個標準過濾函數)的函數。這就是編譯器知道如何處理lambda的方法,例如,如果你編寫lambda來返回一個int,你會得到一個編譯器錯誤。 – expedient 2010-02-12 04:31:37