2009-11-26 86 views
1

鑑於以下結構...獲得的值的總和Linq中

class Foo { 

    public string Category { get; set; } 
    public string Code { get; set; } 
    public int Quantity { get; set; } 

} 

我想這樣,如果我提供以下使用Linq來概括這些對象按類別和代碼的列表,源...

List<Foo> foos = new List<Foo>() { 
    new Foo {Category = @"A", Code = @"B", Quantity = 1}, 
    new Foo {Category = @"A", Code = @"B", Quantity = 2}, 
    new Foo {Category = @"C", Code = @"D", Quantity = 3}, 
    new Foo {Category = @"C", Code = @"D", Quantity = 4} 
}; 

我結束了含有列表...

Foo {Category = @"A", Code = @"B", Quantity = 3}, 
    Foo {Category = @"C", Code = @"D", Quantity = 7} 

(其中數量是原始q之和匹配對象的數量)。

我知道我需要使用group by子句和Sum()擴展方法的組合,我似乎無法找到正確的組合。

請注意,這個列表背後沒有數據庫,我這樣做純粹與對象,因此提取原始列表包括總和不是一個選項。

謝謝。

+0

在運行時創建這些對象?或者在編譯時如上所示? – 2009-11-26 11:55:06

回答

3
var query = foos 
      .GroupBy(x => new { x.Category, x.Code }) 
      .Select(g => new Foo 
       { 
        Category = g.Key.Category, 
        Code = g.Key.Code, 
        Quantity = g.Sum(x => x.Quantity) 
       }); 
+0

非常好,我剛剛根據Ruben的回答得出了這個結論,但是你的回答卻把它交給了我。 – 2009-11-26 12:01:56

+0

沒有必要單獨撥打電話來選擇此處。 GroupBy可以滿足您的所有需求。 – 2009-11-26 12:03:32

+0

@Jon:是的,我意識到我發佈之後,但是因爲你首先得到了我的答案,而不是更新這個答案。 – LukeH 2009-11-26 12:05:50

2

LINQ Merging results in rows非常相似: -

 var result = foos 
      .GroupBy(foo => new 
      { 
       foo.Category, 
       foo.Code 
      }) 
      .Select(fooGroup => new Foo 
      { 
       Category = fooGroup.Key.Category, 
       Code = fooGroup.Key.Code, 
       Quantity = fooGroup.Sum(foo => foo.Quantity) 
      }); 
+0

確實鏈接wa非常相似和有用(+1)。我能夠使用那裏的內容來得到答案,然後根據下面的盧克的答案進行驗證。 – 2009-11-26 12:02:44

+0

好東西。請記住,在上面和下面是一個非常短暫的概念! (順便說一下,對於其他人...我的樣本編輯發生在盧克和喬恩的回覆[但獨立:D]) – 2009-11-26 12:05:56

+0

點上/下面的點 - 必須嘗試和記住! – 2009-11-26 12:19:21

10

您同時按類別和代碼,希望組,所以你想一個匿名類型爲 - 那麼算了筆的數量。您可以在一個單一的呼叫這樣對GroupBy如果使用right overload

var query = list.GroupBy(
    item => new { item.Category, item.Code }, 
    (key, group) => new Foo { Category = key.Category, 
           Code = key.Code, 
           Quantity = group.Sum(x => x.Quantity) }); 

如果您想查詢表達式要做到這一點,你可以使用:

var query = from item in list 
      group item by new { item.Category. item.Code } into items 
      select new Foo { Category = items.Key.Category, 
          Code = items.Key.Code, 
          Quantity = items.Sum(x => x.Quantity) }); 
+0

不錯,不知道那個!誰會想到自己會從FGITWING一個小的LINQ問題中學到一些東西! – 2009-11-26 12:07:02

+0

Upvoted提供了純粹的答案以及您提供兩種語法的事實。謝謝。 – 2009-11-26 12:10:07