我有一个很大的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,000fooKeys.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/