查找一个优化的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?

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

ElementAt需要迭代整个序列,直到它得到你正在请求的项目,所以调用ElementAt N次,其中每个都在搜索N个项目,是非常效率低下。仅通过外部收集foreach,而不是使用ElementAtfor循环。在所有这一切之上,如果实际的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())。哪里(//这里的一些谓词)?