使用 Linq to 对象,如何获取不同日期对象中字段的总计?

Using Linq to objects, how to get the total for the fields in the objects for different date?

我一直在寻找解决我的问题的方法,但找不到我真正需要的,所以我决定提出这个问题:

我有一个包含对象的列表。这些对象是根据文件中的数据创建的。该文件将包含大约 30 份报告。根据报告名称,在那种情况下它是 "REPORT-201",我将在列表中有 28 个对象,其中只有 2 个具有所需的日期:

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

日期为'1/1/0001 12:00:00 AM'的其他26个对象,我不需要

我如何创建另一个列表来包含对象以及我需要的日期的总计。 我想,我需要以某种方式创建一个逻辑来按日期对对象进行分组,汇总所有字段并将每个对象添加到另一个列表中

我有以下逻辑创建了一个包含 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();

如何汇总对象中的字段并将这些对象添加到另一个列表中,或者是否有其他方法可以处理我需要的内容?

 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。

您的初始 linq 似乎是正确的!

错误在第一段,第二段 lineCnt++; 错误并跳过了一行。删除它并使用您编写的第一个 linq。 lineCnt=1 也可能是 Henk 首先注意到的错误。

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++;
    }
}