簡體   English   中英

如何使用LINQ按組合並/求和記錄?

[英]How to merge/sum records by group using LINQ?

例如,如何使用LINQ將GroupId對以下記錄進行分組,並將每個組中的所有其他列相加? (從而將每個組中的所有行合並為一個)

var list = new List<Foo>()
{ 
    new Foo() { GroupId = 0, ValueA = 10, ValueB = 100 },
    new Foo() { GroupId = 1, ValueA = 30, ValueB = 700 },
    new Foo() { GroupId = 1, ValueA = 40, ValueB = 500 },
    new Foo() { GroupId = 2, ValueA = 80, ValueB = 300 },
    new Foo() { GroupId = 2, ValueA = 20, ValueB = 200 },
    new Foo() { GroupId = 2, ValueA = 20, ValueB = 200 }
};

預期結果是:

| GroupId | ValueA | ValueB |
|---------|--------|--------|
|    0    |   10   |   100  |
|    1    |   70   |   1200 |
|    2    |   120  |   700  |
list.GroupBy(i => i.GroupId)
    .Select(g => new { GroupId = g.Key, 
                       ValueA = g.Sum(i => i.ValueA), 
                       ValueB = g.Sum(i => i.ValueB)});

或者只是為了好玩,你可以使用它的重載在一個GroupBy調用中完成它:

list.GroupBy(i => i.GroupId,
       (key, groupedItems) => new {
                                      GroupId = key,
                                      ValueA = groupedItems.Sum(i => i.ValueA),
                                      ValueB = groupedItems.Sum(i => i.ValueB),
                                  });

或者您可以使用Aggregate來避免多次迭代每個組:

list.GroupBy(i => i.GroupId)
    .Select(g => g.Aggregate((i1, i2) => new Foo{ GroupId = i1.GroupId,
                                                  ValueA = i1.ValueA + i2.ValueA,
                                                  ValueB = i1.ValueB + i2.ValueB,
                                                }));
var query = list.GroupBy(x=> x.GroupId)
                .Select(g=> new 
                  {
                     GroupId = g.Key, 
                     ValueA = g.Sum(x => x.ValueA), 
                     ValueB = g.Sum(x => x.ValueB)
                  });

使用GroupBy根據GroupIdFoo收集到組中,然后為結果的每個“行”創建一個新對象(該對象可以是基於您提供的代碼的Foo本身,但它可以很容易地成為任何東西否則,包括匿名類型)。 此時,您還將總結其他值。

var sums = list.GroupBy(f => f.GroupId)
               .Select(g => new Foo
               { 
                   GroupId = g.Key, 
                   ValueA = g.Sum(f => f.ValueA),
                   ValueB = g.Sum(f => f.ValueB)
               }).ToList();

避免使用lambda表達式(幾乎)並使用“純粹”LINQ方式:

var sums = from foo in list
    group foo by foo.GroupId into groupings
    orderby groupings.Key ascending
    select new
    {
        GroupId = groupings.Key,
        ValueA = groupings.Sum(g => g.ValueA),
        ValueB = groupings.Sum(g => g.ValueB)
    };

我認為LINQ與lambda相比看起來更自然一點(並不是說有什么問題......)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM