Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在过滤数据时简化linq_C#_.net_Linq - Fatal编程技术网

C# 在过滤数据时简化linq

C# 在过滤数据时简化linq,c#,.net,linq,C#,.net,Linq,我想征求关于如何简化下面的foreach块的建议。我试图在一个linq语句中实现这一切,但我不知道如何在查询中操作“count”值 关于我努力实现的目标的更多详细信息: -我有一个巨大的列表,其中可能有重复的Id,但属性“计数”是不同的数字 -我想消除重复项,但仍然不丢失那些“计数”值 -因此,对于具有相同Id的项目,我总结了“计数”属性 不过,当前的代码看起来并不漂亮: var grouped = bigList.GroupBy(c => c.Id).ToList(); foreach

我想征求关于如何简化下面的foreach块的建议。我试图在一个linq语句中实现这一切,但我不知道如何在查询中操作“count”值

关于我努力实现的目标的更多详细信息: -我有一个巨大的列表,其中可能有重复的Id,但属性“计数”是不同的数字 -我想消除重复项,但仍然不丢失那些“计数”值 -因此,对于具有相同Id的项目,我总结了“计数”属性

不过,当前的代码看起来并不漂亮:

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();