我有一个很大的EntityObjects IEnumerable和一个很大的字符串IEnumerable,它们是对象的关键。

我想获取仅键匹配的对象的新列表。目前,我正在通过Contains()进行此操作-但似乎很慢?

class Foo {
  string Key
  string Prop1
  int Prop2
  decimal Prop3
  Bar Prop4
  Thing Prop5
  Stuff Prop6
  ...more properties
}

IEnumerable<Foo> foos
IEnumerable<string> fooKeys

var matchedFoos = foos.Where(f => fooKeys.Contains(f.Key));


这可以正常工作并返回我期望的结果,但是似乎很慢,我认为必须有更好的方法?我在Intersect上看到了一些帖子,但似乎是针对相同类型的枚举对象的?

有关信息:


foos.Count()约164,000
fooKeys.Count()约75,000

最佳答案

您可能应该在数据库上(使用LINQ to Entities)而不是在应用程序上(使用LINQ to Objects)进行搜索。
您可以将fooKeys更改为HashSet<string>(如果尚未更改),以使Contains()方法调用O(1)而不是O(n):

var keesSet = new HashSet<string>(fooKeys);
var matchedFoos = foos.Where(f => keesSet.Contains(f.Key));


但是,对于如此庞大的馆藏,仍然需要相当长的时间来执行搜索。

关于c# - LINQ Contains vs Intersect(VS其他)!,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20834189/

10-13 07:01