2011-09-06 68 views
4

我剛剛發現這個lambda表達式C#說明:約lambda表達式

myCustomerList.GroupBy(cust => cust.CustomerId).Select(grp => grp.First());

糾正我,如果我錯了,但這個拉姆達你可以明顯的myCustomerListCustomerId,這就是exaclty我需要什麼。但我試圖弄清楚它是如何工作的。

第一步是groupby:該結果在字典中,IGouping<long, Customer>CustomerId作爲字典的關鍵字。

第二個選擇發生,這是我沒有得到的部分。選擇選擇一個客戶,但是它如何從字典中選擇客戶?你需要一個密鑰,因爲這個羣組。鑰匙在哪裏? First()如何幫助?

你能詳細告訴我最後一部分是如何工作的嗎?

+0

有一個類似的問題[這裏] [1] [1]:http://stackoverflow.com/questions/436954/whos-on-dictionary-first – Marshal

回答

4

它不是從字典中選擇它 - 它是說爲每個分組的結果GroupBy,選擇第一個條目。請注意,IGrouping<TKey, TElement> implements IEnumerable<TElement>

基本上是一個基團具有兩件事情:

  • 一個關鍵
  • A元素

這是選擇來自各組的第一個元素的列表。

+0

但是在後臺,然後發生。當我看到這個時,它建議 - 在我看來 - 建立一個字典(實現IEnumerable)。當該字典被創建時,該選擇被執行。但這種情況並非如此? – Martijn

+0

@Martijn:不,事實並非如此。直到有東西試圖從中讀取分組,它仍然不會被評估 - 儘管此時輸入序列被完全消耗。在GroupBy上爲我的Edulinq博客文章指出你可能是最好的:http://msmvps.com/blogs/jon_skeet/archive/2011/01/01/reimplementing-linq-to-objects-part-21-groupby.aspx –

+0

我還是不明白。選擇發生時,groupBy不會執行嗎?但是什麼時候執行?由於First()方法確實選擇了每個組的第一個對象。 – Martijn

3

讓我們說您的收藏是:

{Name=a, CustomerId=1} 
{Name=a, CustomerId=1} 
{Name=b, CustomerId=2} 
{Name=b, CustomerId=2} 

由IT部門變得

{ key = 1, Values = {Name=a, CustomerId=1}, {Name=a, CustomerId=1} } 
{ key = 2, Values = {Name=a, CustomerId=2}, {Name=a, CustomerId=2} } 

後經過最後一個選擇(即從上面的符號就成了價值第一選擇:

{Name=a, CustomerId=1} 
{Name=a, CustomerId=2} 

因此它是基於ID的不同客戶。