哪个更有效/优雅?

时间:2015-01-05 11:18:34

标签: c# performance linq

根据另一个集合中每个项目的属性值,在一个集合中查找项目的哪种方法更好?除此之外,还有更好的方法吗?

List<Thing> results;    

List<Thing> thingList1 = ...;
List<Thing> thingList2 = ...;

方法A:

results = thingList1.Where(x => thingList2.Any(y => y.Id == x.Id)).ToList();

方法B:

foreach (Thing thing in thingList1)
{
    results.AddRange(thingList2.Where(x => x.Id == thing.Id).Select(y => thing));
}      

2 个答案:

答案 0 :(得分:1)

我会选择加入:

var results = (from item1 in thingList1
               join item2 in thingList2
               on item1.Id equals item2.Id
               select item1).ToList();

我认为上述方法的目的更明确。

另一种选择是,使用Intersect方法:

var results = thingList1.Intersect(thingList2);

这更优雅。但是,您应该注意为您的班级IEquatable<Thing>实施界面Thing。否则,你不能使用它。有关详细信息,请查看here

答案 1 :(得分:0)

最好的方法是使用真实数据编写测试,但是您在列表中多次执行某个位置。从列表中创建字典将为您提供更好的性能。

Dictionary<int, thing> d = thingList2.ToDictornary(x => x.Id);
foreach (Thing thing in thingList1)
{
    results.Add(d[thing.Id]);
}