C# 筛选集合C的最快方法#

C# 筛选集合C的最快方法#,c#,search,C#,Search,我有一个对象集合,我想检索所有属性与搜索字符串匹配的对象。到目前为止,我已经尝试了几种过滤方法,即List.ForAll、IEnumerable.Where和ParallelQuery.Where List<Foo> cache = GetAllObjs(); // source list containing lots of objects List cache=GetAllObjs();//包含大量对象的源列表 备选案文1: List<Foo> foos = ca

我有一个对象集合,我想检索所有属性与搜索字符串匹配的对象。到目前为止,我已经尝试了几种过滤方法,即List.ForAll、IEnumerable.Where和ParallelQuery.Where

List<Foo> cache = GetAllObjs(); // source list containing lots of objects
List cache=GetAllObjs();//包含大量对象的源列表
备选案文1:

List<Foo> foos = cache.AsParallel().Where(x => x.Name == "bar").ToList();
List foos=cache.AsParallel().Where(x=>x.Name==“bar”).ToList();
备选案文2:

List<Foo> foos = cache.Where(x => x.Name == "bar").ToList();
List foos=cache.Where(x=>x.Name==“bar”).ToList();
备选案文3:

List<Foo> foos = cache.FindAll(x => x.Name == "bar");
List foos=cache.FindAll(x=>x.Name==“bar”);
因为ParallelQuery.Where使用多核,所以它似乎是最快的解决方案。除此之外,是否还有其他过滤方法,例如使用不同的集合类型或过滤函数?源集合不必是列表

除此之外,是否还有其他过滤方法,例如使用不同的集合类型或过滤函数

如果可以有多个同名对象,则可以使用
查找
。您可以将查找视为
string->List
字典:

// create
var foosByName = GetAllObjs().ToLookup(x => x.Name, x => x);

// search
var barFoos = foosByName["bar"].ToList();
当然,如果每个名字只有一个
Foo
,那么一本经典的
字典就可以了


在字典或查找中搜索(通常)是一个O(1)操作,而问题中的搜索方法是O(n)。

。。。这可能取决于阵列的大小和其他因素。我确实在赛马。。。反正我能想到的三个。我想知道是否有不同的马可以代替我比赛…很难说(给定的)最好的选择是什么,就像我说的,对于较小的数组/列表,并行线程的加速时间在执行时间方面可能没有任何好处。对
ToList
的调用可能没有必要,因为我改为
Lookup
,这使得搜索几乎是即时的。因为我必须进行子字符串匹配,就像在
x.Name.Contains(“bar”)
中一样,我必须创建一个
查找
,其中索引是
名称
的所有可能的子字符串。它在印前阶段消耗了大量内存,但搜索本身速度极快。@painiyff:很高兴听到这个消息。如果您需要低内存消耗和前缀搜索支持,您可以。