C# 在过滤数据时简化linq
我想征求关于如何简化下面的foreach块的建议。我试图在一个linq语句中实现这一切,但我不知道如何在查询中操作“count”值 关于我努力实现的目标的更多详细信息: -我有一个巨大的列表,其中可能有重复的Id,但属性“计数”是不同的数字 -我想消除重复项,但仍然不丢失那些“计数”值 -因此,对于具有相同Id的项目,我总结了“计数”属性 不过,当前的代码看起来并不漂亮:C# 在过滤数据时简化linq,c#,.net,linq,C#,.net,Linq,我想征求关于如何简化下面的foreach块的建议。我试图在一个linq语句中实现这一切,但我不知道如何在查询中操作“count”值 关于我努力实现的目标的更多详细信息: -我有一个巨大的列表,其中可能有重复的Id,但属性“计数”是不同的数字 -我想消除重复项,但仍然不丢失那些“计数”值 -因此,对于具有相同Id的项目,我总结了“计数”属性 不过,当前的代码看起来并不漂亮: var grouped = bigList.GroupBy(c => c.Id).ToList(); foreach
var grouped = bigList.GroupBy(c => c.Id).ToList();
foreach (var items in grouped)
{
var count = 0;
items.Each(c=> count += c.Count);
items.First().Count = count;
}
var filtered = grouped.Select(y => y.First());
我不期望整个解决方案,我也会高度赞赏一些想法:)鉴于您正在对该系列进行变异,我个人只需使用计数来制作一个新的“项目”:
var results = bigList.GroupBy(c => c.Id)
.Select(g => new Item(g.Key, g.Sum(i => i.Count)))
.ToList();
这将执行从原始到新的
项
实例集合的简单映射,使用正确的Id
和Count
值。FWIW ReSharper擅长将foreach
代码转换为等效的LINQ语句。请检查:明确建议尝试ReSharper evalYou可能可以去掉.ToList(),只处理返回的IEnumerable;这种方法可能更快,因为枚举不是由.ToList()强制执行的。这基本上与原始数据相同-但查询过程中原始数据的变异似乎是错误的;)@李德波西:在我看到你的评论之前,我很想知道国王的答案。您可能希望编辑您的答案,以添加更多的背景信息,说明您选择避免对集合进行变异的原因。@AndrewCoonce我对这个答案做了+1,但觉得我需要发表评论,因此,至少我们知道,这确实会导致原始数据发生变异。此外,请意识到,除非您反复使用它(即:使用foreach
或仅在末尾添加ToList()
)@ReedCopsey当然,,我猜他可能想为每个人执行一些操作,比如打印信息。很抱歉,您的项目可能缺少更多信息,比如原始项目没有唯一的Id
和Count
,它可能有更多的属性,OP希望包含/保留所有属性?我们可以使用构造函数
来创建原始类型的新实例,但OP没有显示原始类型,因此它被卡住了。@KingKing是的-这需要添加到构造中-不过,您应该始终能够通过构造函数(或对象初始值设定项)复制该对象。看起来不错!但正如@KingKing所提到的,你丢失了关于原始数据的所有信息,我仍然需要这些信息。
var results = bigList.GroupBy(c => c.Id)
.Select(g => new Item(g.Key, g.Sum(i => i.Count)))
.ToList();