C# LINQ к Объектам: Группа/суммировать справкой

В списке объектов транзакции я пытаюсь сгруппироваться BatchNo, затем суммируют Суммы.

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?

6
задан Mohgeroth 4 July 2010 в 20:15
поделиться

2 ответа

Вам нужно вызвать 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
    };
16
ответ дан 8 December 2019 в 12:57
поделиться

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

2
ответ дан 8 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: