【问题标题】:fastest way to find string in C#?在 C# 中查找字符串的最快方法?
【发布时间】:2010-07-21 16:31:24
【问题描述】:

在 C# 中实现此类功能的最快方法是什么:

  private List<string> _myMatches = new List<string>(){"one","two","three"};
  private bool Exists(string foo) {
      return _myMatches.Contains(foo);
  }

注意,这只是一个例子。我只需要对一些源自字符串的值执行低级过滤。我可以实习他们,但仍然需要支持一个或多个字符串的比较。含义,字符串到字符串比较(1 个过滤器),或者字符串是否存在于字符串列表中(多个过滤器)。

【问题讨论】:

  • 内存/预处理过载和数据量如何更快?
  • Reed 关于 HashSet 的回答是如果您只需要查找字符串的方法。如果您需要一些额外的东西(“需要支持比较一个或多个匹配项”),您可能需要一个自定义数据结构,可能与 HashSet 类似。

标签: c# performance string


【解决方案1】:

您可以使用HashSet&lt;T&gt; 来加快速度,尤其是在您要添加更多元素的情况下:

private HashSet<string> _myMatches = new HashSet<string>() { "one", "two", "three" };

private bool Exists(string foo)
{
    return _myMatches.Contains(foo);
}

这将击败 List&lt;T&gt;,因为 HashSet&lt;T&gt;.Contains 是 O(1) 操作。

另一方面,List&lt;T&gt; 的 Contains 方法是 O(N)。它将在每次调用时搜索整个列表(直到找到匹配项)。随着添加更多元素,这将变得更慢。

【讨论】:

  • +1 - 我会选择这个。鉴于 HashTables 不存储信息对,因此它看起来并不合适。我立即想到的是字典,但我丢弃它的原因与我丢弃 HashTable 的原因相同。
  • 一些小问题:假设结构应该只包含唯一值,并且填充时间和内存消耗无关紧要。
  • @Sonic Soul - 如果它们是此处代码示例中的文字,那么它们将已经被实习。实习通常是内存优化而不是速度优化,但如果你有足够的重复来防止过度分页,它也可能有助于提高速度。如果你的集合中有很多字符串,请记住,interning 意味着在 CLR 终止之前可能不会释放字符串。
【解决方案2】:

哈希表是您快速查找字符串的好朋友。

Working with HashTable in C# 2.0看一个很好的教程

【讨论】:

  • 最好使用 HashSet,因为它是类型安全的,并且专为这种类型的操作而设计。
【解决方案3】:

您将不得不进行概要分析。你的意思是最快的查找(即初始化时间是否计算在内)?

@Elf King 已经提到了 Hash Tables,我要指出的是(特别是 HashSet&lt;T&gt;

【讨论】:

    猜你喜欢
    • 2016-10-05
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 2018-07-26
    • 2015-01-14
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多