2010-07-04 2 views
6

В списке объектов транзакции я пытаюсь группировать BatchNo, а затем суммировать суммы.C# LINQ to Objects: Справка по группе/сумме

public class Extract 
{ 
    // Notable fields in TRANSACTION are: String mBatchNo, String mAmount 
    private List<Transaction> Transactions; 

    public void testTransactions() 
    { 

     // Sum of amounts grouped by batch number 
     var sGroup = from t in Transactions 
        group t by t.mBatchNo into g 
        select new { batchNo = g.Key, 
            totalAmount = g.Max(a => (Int32.Parse(a.mAmount)))}; 
    } 
} 

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

Последняя партия в файле имеет 3 записи, 100 сум, каждая из которых может быть свернута в объект списка транзакций. Однако, сверление в результат sGroup находит ту же самую партию, чтобы иметь 100 сумм (должно быть 300). Что я испортил в этом запросе?

Обратите внимание, что я сохранил это как строку, так как мы заполнены нулями слева от поля с 8 символами. По причинам экспорта я решил хранить в виде строки. Хотя это может (и, вероятно, будет) изменено, оно не отвечает на мой вопрос: как сделать этот запрос агрегировать сумму в множества BatchNo?

ответ

16

Вам нужно позвонить Sum вместо Max:

var sGroup = from t in Transactions 
    group t by t.mBatchNo into g 
    select new { 
     batchNo = g.Key, 
     totalAmount = g.Sum(a => (int.Parse(a.mAmount))) // Sum, not Max 
    }; 

Я также хотел бы предложить, если ваш mAmount поле хранится в виде string, чтобы использовать более надежный метод, чем int.Parse (так как это будет сгенерировано исключение если строка не является допустимым целым числом, например, если она пустая). Что-то вроде этого:

int ParseOrZero(string text) 
{ 
    int value; 
    if (int.TryParse(text, out value)) 
     return value; 
    else 
     return 0; 
} 

var sGroup = from t in Transactions 
    group t by t.mBatchNo into g 
    select new { 
     batchNo = g.Key, 
     totalAmount = g.Sum(ParseOrZero) // blanks will be treated as 0 
    }; 
+0

wow его было looooong выходные для меня, чтобы пропустить это! Спасибо за ввод исключений! – Mohgeroth

2

Вместо того, чтобы делать максимум, вы должны использовать сумму в своей группе. Прямо сейчас вы устанавливаете свойство только для максимального значения в объекте, сумма будет суммировать все значения в свойстве.

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