阅读清单&lt;&gt;使用Enumerable.GroupBy对象和映射到新的List <summary>对象

时间:2017-01-12 15:13:58

标签: c# list

我有以下输入列表:

    **AccountModel.cs**
    CompanyCode
    BusinessCode
    State

我需要通过List&lt; AccountModel &gt;进行迭代并创建以下输出列表&lt; SummaryModel &gt;

    **SummaryModel.cs**
       RecordCount
       CompanyCode
       BusinessCode
       State

示例输入列表:

   { 
    CompanyCode  = "A",
    BusinessCode = "AAA",
    StateCode    = "GA",
   },

   { 
    CompanyCode  = "A",
    BusinessCode = "AAA",
    StateCode    = "GA",
   },
   { 
    CompanyCode  = "A",
    BusinessCode = "AAA",
    StateCode    = "TN",
   },
   { 
    CompanyCode  = "A",
    BusinessCode = "AAA",
    StateCode    = "TN",
   },

预期结果:

    RecordCount  = 2
    CompanyCode  = A
    BusinessCode = AAA
    StateCode    = GA

    RecordCount  = 2
    CompanyCode  = A
    BusinessCode = AAA
    StateCode    = TN

到目前为止,我试图通过使用以下方法来解决这个问题:

     IEnumerable<IGrouping<string, string>> query = accountModels.GroupBy(accountModel=> accountModel.CompanyCodeModel, accountModel => accountModel.CompanyCodeModel);

        // Iterate over each IGrouping in the collection.
        foreach (IGrouping<string, string> companyCodeGroup in query)
        {
            SummaryModel.CompanyCode = companyCodeGroup.Key;

            foreach (var code in companyCodeGroup)
            {
                SummaryModel.RecordCount++;
            }

    // Print the record count of the IGrouping.
        Console.WriteLine("RecordCount = " + SummaryModel.RecordCount);
        Console.WriteLine("CompanyCode = " + SummaryModel.CompanyCode);
        Console.WriteLine("BusinessCode = " + SummaryModel.BusinessCode);
        Console.WriteLine("StateCode = " + SummaryModel.StateCode);
        Console.ReadKey();

实际结果:

    RecordCount  = 4
    CompanyCode  = A
    BusinessCode = 
    StateCode    = 

我此时只编写了公司的分组编码,因此我意识到在本例中我没有为BusinessCode和StateCode打印任何内容。

对某些人来说这可能是显而易见的,但我怎样才能得到我预期的结果呢?

2 个答案:

答案 0 :(得分:2)

只需GroupBy您想要汇总的所有字段,即CompanyCodeBusinessCodeStateCode。 您可以使用GroupBy中的匿名对象执行此操作。

然后在每个分组上调用Count()将为您提供记录计数。您可以使用所有这些为每个组合创建SummaryModel

List<SummaryModel> summaryModels = accountModels.GroupBy(accountModel => new {
    accountModel.CompanyCode
    accountModel.BusinessCode
    accountModel.StateCode
}).Select(amSummary => new SummaryModel {
    CompanyCode = amSummary.Key.CompanyCode,
    BusinessCode = amSummary.Key.BusinessCode,
    StateCode = amSummary.Key.StateCode,
    RecordCount = amSummary.Count() 
}).ToList();

答案 1 :(得分:1)

这应该没问题。

accountModels.Distinct().Select(a => new SummaryModel {
    CompanyCode = a.CompanyCode,
    BusinessCode = a.BusinessCode,
    StateCode = a.StateCode,
    RecordCount = accountModels.Where(
        m => m.CompanyCode == a.CompanyCode && m.BusinessCode = a.BusinessCode && m.StateCode = a.StateCode
    ).Count()
});