Суммирование отдельных элементов списка объектов - PullRequest
0 голосов
/ 25 февраля 2011

Не могу понять, как решить эту проблему с помощью linq.Возможно, мой синтаксис выключен.

Учитывая следующий объект:

Data
-----------
string type  
string number  
string value

У меня есть IEnumerable<Data> объекты.Я в основном хочу вернуть 1 объект данных со суммированными значениями (тип и число в этом случае будут идентичны).

Первоначально я думал, что это случай для функции Aggregate(), но я не могу получитьсинтаксис правильный.

Вот что у меня было, хотя я понимаю, что это неправильно:

var results = thisData.Aggregate(new Data(), (data, item) => { item.value?? });

Спасибо!

Обновление
IДумаю, я не очень хорошо задал свой вопрос.В конце этого процесса мне нужна только 1 запись, содержащая тип, число и суммарное (или совокупное) значение.Есть ли простой элегантный способ добиться этого?

Ответы [ 2 ]

1 голос
/ 25 февраля 2011
var results = thisData.Aggregate(new Data() 
                                 { 
                                   type = thisData.First().type, 
                                   number = thisData.First().number 
                                 } , (data, item) => data.value += item.value );
0 голосов
/ 25 февраля 2011

Попробуйте:

var results = thisData.Sum( d => int.Parse(d.value) );

Это эквивалентно:

var results = thisData.Aggregate( 0, (seed, d) => seed + int.Parse(d.value) );

То есть, думая, что вы хотите сложить только значения (и, конечно, они являются целыми числами).

Агрегирование имеет смысл только тогда, когда ваши типы образуют группу (в математическом смысле) относительно вашей желаемой операции (например, сумма). Наличие группы гарантирует вам нейтральный элемент (0) и операцию (+), которую вы можете использовать.

Строки образуют группу с {"", +}, целые числа образуют группу с {0, +} и {1, *}.

...