2010-03-20 35 views

回答

16

本質上它是一個Select(在大多數情況下),它引入了一個透明標識符 - 通過一個匿名類型封裝所有當前指定的範圍變量。例如,下面的查詢:

string[] names = { "Jon", "Mark" }; 

var query = from name in names 
      let length = name.Length 
      where length > 3 
      select name + ": " + length; 

被翻譯成這樣的:

var query = names.Select(name => new { name, length = name.Length }) 
       .Where(z => z.length > 3) 
       .Select(z => z.name + ": " z.length); 
+2

不要吝嗇批評你的答案(上相反我很感激),但因爲我可以使用let子句要寫更復雜的方法,並且在你的例子中,點符號已經比查詢exp對應物更可讀,我認爲這是查詢exp比點國更可取的另一種情況。我知道的另一個案例涉及編寫連接。你是否同意這種觀察?感謝您的回答。 – 2010-03-20 21:14:15

+4

@Khnle:這可能是個人喜好的問題。在這種情況下,我更喜歡點符號的外觀。一旦你習慣了lambda語法,它很容易閱讀,更能描述實際發生的事情,並且不需要'let'語句的附加語法糖。 – 2010-03-20 22:15:03

+2

@Khnle:是的 - 我通常會發現,引入透明標識符(包括let和join)的查詢表達式比它們的點符號等價物更具可讀性。羅伯特的權利 - 這絕對是個人喜好。 – 2010-03-20 22:46:47