2

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

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

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

这是使相信代码:

// 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;    
    }
}

干杯:)

4

1 回答 1

6

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

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; 
}

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

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

于 2009-03-12T05:30:13.590 回答