C# 读取列表对象并使用Enumerable.GroupBy映射到新列表对象
我有以下输入列表:C# 读取列表对象并使用Enumerable.GroupBy映射到新列表对象,c#,list,C#,List,我有以下输入列表: **AccountModel.cs** CompanyCode BusinessCode State 我需要遍历列表并创建以下输出列表 输入列表示例: { CompanyCode = "A", BusinessCode = "AAA", StateCode = "GA", }, { CompanyCode = "A", BusinessCode = "AAA",
**AccountModel.cs**
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();
我现在只为公司编码了分组,所以我意识到在这个示例中,我没有打印任何关于BusinessCode和StateCode的内容
这对某些人来说可能是显而易见的,但我如何才能得到预期的结果呢?只需按您要汇总的所有字段分组,即公司代码、业务代码、状态代码。
您可以使用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();
只需按所有要汇总的字段分组,即公司代码、业务代码、状态代码。
您可以使用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();
这应该没问题
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()
});
这应该没问题
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()
});
meList.GroupBye=>newaccountmodel{CompanyCode=e.CompanyCode,BusinessCode=e.BusinessCode,StateCode=e.StateCode},e=>meList.Counten=>en==e;应返回带有发生次数计数但未验证的AccountModel:meList.GroupBye=>new AccountModel{CompanyCode=e.CompanyCode,BusinessCode=e.BusinessCode,StateCode=e.StateCode},e=>meList.Counten=>en==e;应返回带有发生次数计数的AccountModel,但未经验证:如果已经存在.GroupBy函数并且问题已经在尝试使用它,则我不会重新创建手动分组的控制盘。不是向下投票,而是向上投票@rhumborl这不是分组。将元素分组在一起,这一个正在计数。是的,您的代码没有分组,但问题是试图分组,看起来他想使用iGroup上的手动计数获得摘要。我想知道如果后面有数据库的话,您的答案是否符合性能要求。它会转换成子查询吗?老实说,另一个aswer肯定不会翻译成子查询。即使后面没有数据库,这种方法也不符合性能要求。但是,如果有人非常关心性能,那么诚实地说C也不是最好的选择。将错误的linq to sql、entity framework或其他ORM查询写入一个包含100k+记录的数据库,而不管它是用什么语言编写的。我将14小时的运行过程缩短为12分钟,只修复了用于加载数据的查询。在“相当大的表”中有显式子查询。顺便说一句,当时的罪魁祸首是PL/SQL,而不是C.:-如果已经有了.GroupBy函数,并且问题已经在尝试使用它,我不会重新发明手动分组的轮子。不是向下投票,而是向上投票@rhumborl这不是分组。将元素分组在一起,这一个正在计数。是的,您的代码没有分组,但问题是试图分组,看起来他想使用iGroup上的手动计数获得摘要。我想知道如果后面有数据库的话,您的答案是否符合性能要求。它会转换成子查询吗?老实说,另一个aswer肯定不会翻译成子查询。即使后面没有数据库,这种方法也不符合性能要求。但是,如果有人非常关心性能,那么诚实地说C也不是最好的选择。将错误的linq to sql、entity framework或其他ORM查询写入一个包含100k+记录的数据库,而不管它是用什么语言编写的。我将14小时的运行过程缩短为12分钟,只修复了用于加载数据的查询。在“相当大的表”中有显式子查询。顺便说一句,当时的罪魁祸首是PL/SQL,而不是C:-