Используя Linq для объектов, как получить сумму для полей в объектах на разные даты? - PullRequest
0 голосов
/ 30 мая 2018

Я искал решение своей проблемы, но не смог найти именно то, что мне нужно, поэтому я решил создать этот вопрос:

У меня есть список, содержащий объекты.Эти объекты создаются на основе данных из файла.В файле будет около 30 отчетов.Исходя из названия отчета, в данном случае это «ОТЧЕТ-201», в списке будет 28 объектов, из которых только 2 с необходимыми датами:

'4/26/2018 12:00:00 AM'
'4/27/2018 12:00:00 AM'

Другие 26 объектов с датой'1/1/0001 12:00:00 AM', мне не нужно

Как мне создать еще один список, который будет содержать объекты с итогами на нужные мне даты.Я думаю, мне нужно как-то создать логику для группировки объектов по датам, суммировать все поля и добавлять каждый объект в другой список

У меня есть следующая логика, которая создала предварительный список, содержащий 28 объектов:

for(int lineCnt = 1; lineCnt <. fileLines.Count(); lineCnt++)
{
    if (fileLines[lineCnt].Contains("REPORT-201"))
    {
        report201 = new Report201();
        report201= CreateReport201Data(lineCnt, fileLines);
        listReports201.Add(report201);
        lineCnt++;
    }
}

Я попытался обобщить данные следующим образом:

report201Purchase = listReports201.Where(report201=> report201.ReportDate == reportDate).Sum(report201 => report201.PurchaseDec);

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

Теперь я пытаюсь создать список, который будет содержать только объекты с конкретными датами с итогами дляэти даты:

var report201FinalList = (from report201Objects in listReports201
            group report201Objects by new { report201Objects.ReportDate } into grouping
            orderby grouping.Key.ReportDate
            select new Report201
            {
                 ReportDate = grouping.Key.ReportDate,
                 PurchaseDec = ?
                 QuasiCashDec = ?
                 ...etc... 
            }).ToList();

Как я могу суммировать поля в объектах и ​​добавить эти объекты в другой список или, если есть другой способ обработать то, что мне нужно?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Ваш первоначальный linq кажется правильным!

Ошибка в первом фрагменте, второй lineCnt++; неверен и пропускает строку.Удалите это и используйте первый linq, который вы написали.lineCnt=1 также может быть неправильным, поскольку Хенк замечает первым.

for(int lineCnt = 0; lineCnt < fileLines.Count(); lineCnt++)
{
    if (fileLines[lineCnt].Contains("REPORT-201"))
    {
        report201 = new Report201();
        report201= CreateReport201Data(lineCnt, fileLines);
        listReports201.Add(report201);
        //lineCnt++;
    }
}
0 голосов
/ 30 мая 2018
 var report201FinalList = (from report201Objects in listReports201
        group report201Objects by  report201Objects.ReportDate into grouping
        orderby grouping.Key
        select new Report201
        {
             ReportDate = grouping.Key,
             PurchaseDec = grouping.Sum(g => g.PurchaseDesc),
             QuasiCashDec = grouping.Sum(g => g.QuasiCashDec ),
             RepId = string.Join(",", grouping.Select(g => g.RepId)),
             ...etc... 
        }).ToList();

В этом запросе grouping - это IGrouping<>, IEnumerable со свойством Key.

...