2010-11-12 55 views
17

注意:在您閱讀或提供答案之前,我知道Enumerable.Distinct,我在詢問該方法的特定語言支持,而不是方法本身。爲什麼LINQ不包含「distinct」關鍵字?

我一直想知道爲什麼在設置這樣我就可以寫C#LINQ關鍵字沒有distinct關鍵字:

var items = distinct from x in y 
      select x; 

var items = from x in y 
      select distinct x; 

有人知道爲什麼這不包括或者爲什麼包含它會是一個糟糕的主意?我只是覺得麻煩,我不得不打包查詢只是爲了呼叫Distinct();一個distinct關鍵字會感覺更自然。

注意:我知道如果需要,Distinct方法會覆蓋提供比較器,但使用默認比較器的關鍵字會很好。我甚至可以想象一個distinct by關鍵字組合,以便比較運算符可以內聯提供給查詢。

+1

我希望我們能有這一點。會更加可讀,而且它經常被使用。 – 2010-11-12 17:19:44

+0

@qstarin:我問了這個問題,因爲我在2天內第5次需要它。 – 2010-11-12 17:21:17

+0

也許我們應該爲C#開發一個「獨特的關鍵字」facebook組織。它在SNL上得到了Betty White ... – 2010-11-12 17:30:40

回答

10

查理卡爾弗特有一個blog post ("Using Distinct and Avoiding Lambdas")討論這個問題。從後上方:

  1. 大多數查詢操作符如Select()Where()GroupBy()採取一種叫做lambda作爲一個參數。
  2. 蘭姆達斯很難寫。
  3. 查詢表達式的創建大部分是爲了允許開發人員使用LINQ,而無需瞭解與lambda相關的複雜語法。
  4. 一些查詢運算符(如Distinct())不會將lambdas作爲參數。因此,他們很容易打電話。
  5. 查詢表達式因此不會爲不帶lambda表達式的運算符(如Distinct())創建。

並且還從後進一步下跌:

查詢經營者的方法調用。換句話說,LINQ API中有一些方法稱爲Select()Group(),Distinct()等。我們通常不直接調用這些方法,因爲它們將lambdas作爲參數,許多人發現lambda表達式很難理解。爲了幫助開發人員避免編寫lambda的複雜任務,該團隊發明了查詢表達式,這是一種位於lambda之上的「語法糖」。

TL; DR:有爲了簡單起見沒有distinct關鍵字,因爲distinct不採取lambda表達式。

+2

很好的答案,謝謝。這聽起來很棒,但它不適合人們如何使用這些東西。這將是非常有用的,使事情更容易閱讀。我不認爲Charlie Calvert提出的論點真的很強 - 尤其是因爲關鍵字WAS包含在VB中。 – 2010-11-12 17:24:04

+6

「我們通常不會直接調用這些方法,因爲它們將lambda作爲參數,許多**程序員不值得他們認爲lambda很難理解。」 - FTFY。 – Juliet 2010-11-12 17:36:12

+2

完全同意你倆。 Lambdas並沒有那麼難,我之前就被絆倒 - 「等等,所以有'Distinct()'方法,但沒有'distinct'關鍵字?」對我來說毫無意義。 – Donut 2010-11-12 17:45:38

14

在VB中,實際上

Dim l = From x In {1, 2, 3, 2, 4, 2} Distinct Select x 

我不懷疑有針對distinct對C#一些積極的決定,它只是一直沒有執行。

+0

當然,我不想在VB中編寫我所有的LINQ。 :) – 2010-11-12 17:22:17

+2

VB還支持查詢格式的「Take」和「Skip」。 – 2010-11-12 17:22:29

+0

VB在查詢格式中也有'Aggregate ... Into'?這也存在於C#中嗎? – Dario 2010-11-12 17:25:53

5

Reword:distinct是一個集合運算符...集合運算符不會將lambdas作爲參數。 C#團隊決定爲您提供採用lambdas的方法的快捷方式,例如Select()Group(),因爲他們認爲lambda可能會讓剛剛開始的人感到困惑。 .Distinct()不需要lambda,所以直接調用它時很明顯。

關於這個問題的一個很好的閱讀:
http://blogs.msdn.com/b/charlie/archive/2006/11/19/linq-farm-group-and-distinct.aspx

+1

這解釋了區別,但我仍然不認爲它回答了這個問題。 'in'不使用lambda。這是一個方便。這個論點是有缺陷的,特別是當看到VB獲得關鍵字時。我認爲辯解是微弱的 - 這不是對你的答案的批評,而是你傳達了信息,但你明白我的觀點。 – 2010-11-12 17:31:39

+0

重寫。你說得對,關鍵是它只是一種方便。 c#團隊決定不需要''.Distinct()方便'(顯然VB團隊不同意) – 2010-11-12 17:34:56

+1

我認爲他們對於不同的方面做出了糟糕的決定。 – 2010-11-12 17:36:23