Получение суммы значения в Linq - PullRequest
1 голос
/ 26 ноября 2009

Учитывая следующую структуру ...

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}

(где Количество - сумма исходных количеств совпадающих объектов).

Я знаю, что мне нужно использовать комбинацию из предложения group by и методов расширения Sum(), но я просто не могу найти правильную комбинацию.

Обратите внимание, что за этим списком нет базы данных, я делаю это исключительно с объектами, поэтому извлечение исходного списка, включая сумму, не вариант.

Спасибо.

Ответы [ 3 ]

10 голосов
/ 26 ноября 2009

Вы хотите сгруппировать по категориям и по коду, поэтому вам понадобится анонимный тип для этого, а затем просто суммируйте количества. Вы можете сделать это за один вызов GroupBy, если используете правую перегрузку :

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) });
3 голосов
/ 26 ноября 2009
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)
                });
2 голосов
/ 26 ноября 2009

LINQ Результаты слияния в строках очень похожи: -

        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 ) 
            } );
...