根据另一个集合中每个项目的属性值,在一个集合中查找项目的哪种方法更好?除此之外,还有更好的方法吗?
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));
}
?
答案 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]);
}