查找优化的linq语句以查找嵌套的IEnumerable集合中的最接近的总和

时间:2015-08-13 18:42:34

标签: c# performance linq

我有一个包含100,000个节点的IEnumerable集合,每个节点都是int:

的集合
user_defined_path/python34/Lib/site-packages/

我需要在每个2级节点内找到整数的总和,然后找到总和小于或等于所需数量的节点(目标)

我尝试遍历所有节点并找到最接近的总和但是耗时(每个节点220毫秒),对于100,000个节点的列表,它需要很长时间。

有没有更快的方法可以使用Linq和Lambda找到它?

任何建议都将受到高度赞赏。

3 个答案:

答案 0 :(得分:1)

ElementAt需要迭代整个序列,直到它到达您要求的项目为止,因此调用ElementAt N次,每个人搜索n个项目,< em>非常效率低下。只需foreach通过外部集合,而不是使用for循环ElementAt。除此之外,如果实际的IEnumerable代表了进行复制工作的查询,那么您每次尝试时都会为每个项目重新计算所有这些工作获取新项目,这意味着您需要重新创建然后丢弃批次项目。

如果您确实需要处理索引(您应该强烈考虑不要这样做),那么您应该将查询具体化为可以有效索引的List。 / p>

答案 1 :(得分:0)

也许您可以尝试使用Select(x =&gt; x.Sum())。其中(//这里有一些谓词)?

答案 2 :(得分:0)

请考虑以下代码:

var closestSum= list.Select (x => new {Node=x,Sum=x.Sum ()})
.Where (x => x.Sum<=target)
.OrderByDescending (x=>x.Sum)
.FirstOrDefault ()

然后,您可以通过closestSum.Sum访问总和,并使用closestSum.Node

的int元素访问原始节点

如果您需要节点的索引

list.Select ((x,Index) => new {Index,Node=x,Sum=x.Sum ()})
.Where (x => x.Sum<=target)
.OrderByDescending (x=>x.Sum)
.FirstOrDefault ()

然后closestSum.Index