查找一个优化的linq语句,以查找嵌套IEnumerable集合中最接近的和
本文关键字:查找 嵌套 IEnumerable 集合 最接近 linq 优化 一个 语句 | 更新日期: 2023-09-27 18:07:45
我有一个100,000个节点的IEnumerable集合,每个节点是int的集合:
IEnumerable<IEnumerable<int>> List2 ;
var target = 39;
.....
for (int UserNo = 1; UserNo <= 100000; UserNo++)
{
int minClosestTargetRequired = 0;
int closestSum = 100000000;
int closestSetIndex = -1;
for (var c = 0; c < List2.Count(); c++)
{
int currentSum = List2.ElementAt(c).Sum(o => o);
if (currentSum < closestSum)
{
closestSum = currentSum;
closestSetIndex = c;
}
if (closestSum <= minClosestTargetRequired)
break;
}
}
我需要找到每个2级节点内整数的总和,然后找到总和小于或等于所需数字的节点(目标)
我尝试遍历所有节点并找到最接近的和,但这很耗时(每个节点220毫秒),并且对于100,000个节点的列表需要很长时间。
是否有任何更快的方法来找到它使用Linq和Lambda?
ElementAt
需要迭代整个序列,直到它得到你正在请求的项目,所以调用ElementAt
N次,其中每个都在搜索N个项目,是非常效率低下。仅通过外部收集foreach
,而不是使用ElementAt
的for
循环。在所有这一切之上,如果实际的IEnumerable
表示一个执行交换工作的查询,则每次尝试获得新项目时,您都要重新计算经过的每个项目的所有工作,这意味着您正在重新创建并然后丢弃批次项。
如果你真的需要处理索引(你应该强烈考虑根本不做),那么你应该将查询具体化到一个可以有效索引的List
。
考虑以下代码:
var closestSum= list.Select (x => new {Node=x,Sum=x.Sum ()})
.Where (x => x.Sum<=target)
.OrderByDescending (x=>x.Sum)
.FirstOrDefault ()
然后你可以通过closestSum.Sum
和原始节点的int元素通过closestSum.Node
访问和
如果需要节点的索引
list.Select ((x,Index) => new {Index,Node=x,Sum=x.Sum ()})
.Where (x => x.Sum<=target)
.OrderByDescending (x=>x.Sum)
.FirstOrDefault ()
closestSum.Index
也许你可以尝试使用Select(x => x. sum())。哪里(//这里的一些谓词)?