【问题标题】:Fastest way to filter a collection C# [closed]过滤集合 C# 的最快方法 [关闭]
【发布时间】:2016-02-12 21:47:57
【问题描述】:

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

List<Foo> cache = GetAllObjs(); // source list containing lots of objects

选项 1:

List<Foo> foos = cache.AsParallel().Where(x => x.Name == "bar").ToList();

选项 2:

List<Foo> foos = cache.Where(x => x.Name == "bar").ToList();

选项 3:

List<Foo> foos = cache.FindAll(x => x.Name == "bar");

因为 ParallelQuery.Where 使用多个内核,所以它似乎是最快的解决方案。除了这些,还有其他过滤方法吗,比如使用不同的集合类型,或者过滤函数?源集合不必是列表。

【问题讨论】:

  • Race the horses... 这可能取决于数组的大小和其他因素
  • 我确实赛过马匹……反正我能想到的三匹马。我想知道周围是否有不同的马可以代替我比赛......
  • 很难说(给定的)最佳选择是什么,就像我说的,对于较小的数组/列表,并行线程的启动时间可能不会提供任何好处的执行时间。可能也不需要调用ToList

标签: c# search


【解决方案1】:

除了这些,还有其他过滤方法吗,比如使用不同的集合类型,或者过滤函数?

如果您可以拥有多个同名对象,则可以使用Lookup&lt;string, Foo&gt;。您可以将查找视为string -&gt; List&lt;Foo&gt; 字典:

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

// search
var barFoos = foosByName["bar"].ToList();

当然,如果每个名字只有一个Foo,那么经典的Dictionary&lt;string, Foo&gt; 就可以了。

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

【讨论】:

  • 哦,哇,我改成了Lookup&lt;string, Foo&gt;,它让搜索几乎瞬间完成。因为我必须进行子字符串匹配,就像在x.Name.Contains("bar") 中一样,所以我必须创建一个Lookup,并将索引作为Name 的所有可能子字符串。它在预处理阶段占用了大量内存,但搜索本身非常快。
  • @painiyff:很高兴听到这个消息。如果你需要低内存消耗的东西前缀搜索支持,你可以use a trie (sic) or a binary search through a SortedDictionary.
猜你喜欢
  • 2016-12-29
  • 2021-04-08
  • 2021-09-18
  • 2014-02-08
  • 2011-01-24
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多