【问题标题】:What's the most efficient way to do these two foreach-loops?执行这两个 foreach 循环的最有效方法是什么?
【发布时间】:2010-10-12 20:32:00
【问题描述】:

我不确定这是执行以下代码的最佳方法。我没有在另一个 foreach 中的 foreach 上出售。使用 Linq 可以做到*更好** 吗?

*我知道更好的是
a) 性能更高
b) 更容易阅读/更优雅
c) 以上所有

注意:接受 .NET 3.5 解决方案 :) 注意 2:这两个 IList 是多记录集存储过程的结果,通过 Linq2Sql。

这里是 make believe 代码:

// These two lists are the results from a IMultipleResults Linq2Sql stored procedure.
IList<Car> carList = results.GetResult<Car>().ToList();
IList<Person> people = results.GetResult<Person>().ToList();

// Associate which people own which cars.
foreach(var person in people)
{
    var cars = (from c in cars
                where c.CarId == person.CarId
                select c).ToList();

    foreach (var car in cars)
    {
        car.Person = person;    
    }
}

干杯:)

【问题讨论】:

    标签: linq-to-sql .net-3.5 foreach


    【解决方案1】:

    我认为性能不会有任何不同,但如果您正在寻找简洁性:

    var q = from person in people
            join car in cars on person.CarId equals car.CarId
            select new { car, person };
    foreach(var o in q)
    {
      o.car.Person = o.person; 
    }
    

    编辑:在 Jon 暗示这个版本更快之后,我很好奇并分析了这两个函数。这个版本似乎快了两倍,这太神奇了。我检查了拆卸。原始实现的开销似乎来自为外部和内部循环创建的新枚举器,导致 P 次 new/dispose 开销。

    对于这段代码,只创建了一个枚举器,我认为这是“加入”功能的魔力。不过我没有研究它是如何工作的。

    【讨论】:

    • 我相信这个 表现更好,因为它将在连接内使用哈希表 - 复杂性将是 O(P+C) 而不是 O(PC) 我*认为
    • 乔恩,它似乎真的更快。看起来你在 O(P+C) vs O(P*C) 事情上是对的,因为这个版本在 join 运行后创建了一个枚举器,而原始版本使用两个外部/内部枚举器。我将我的发现添加到答案中。
    • 哦,伙计们——还有一个问题。这个答案是否可以更新为扩展方法(或至少是静态方法?)
    • 尽可能使其更通用。这是一段非常糟糕的代码,我想知道是否有可能做这样的事情。也许不是。
    • 如果你的代码是通用的,我会做我的。否则答案和问题不相关。
    猜你喜欢
    • 2018-07-06
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多