2009-11-26 2 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} 

(где количество является суммой первоначального д совместимости объектов).

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

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

Спасибо.

+0

Являются ли эти объекты, создаваемые во время выполнения ? или во время компиляции, как показано выше? –

ответ

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

Отлично, я просто пришел к такому выводу, основанному на ответе Рубена выше, но ваш ответ передал его мне на тарелку. –

+0

Нет необходимости в отдельном вызове для выбора здесь. GroupBy делает все, что вам нужно. –

+0

@Jon: Да, я понял, что после того, как я разместил сообщение, но так как вы туда попали, я скорее поддержал ваш ответ, а не обновил его. – LukeH

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

Действительно связь очень похожа и полезна (+1). Я смог получить ответ, используя то, что было там, а затем проверить его на ответ Люка ниже. –

+0

Хороший материал. И помните, что на SO, выше и ниже это очень временная концепция! (BTW, для других ... Мое редактирование в примере произошло после ответов Luke & Jon [но независимо: D]) –

+0

Точка, занятая выше/ниже, должна попытаться запомнить это! –

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! –

+0

Упрощенный для ясности ответа, а также тот факт, что вы предоставили его в обоих синтаксисах. Спасибо. –

Смежные вопросы