c# - 加快在 C# 中处理大字符串数组的速度

标签 c# list

此方法从字符串数组中获取最频繁出现的单词。 对于大数组,它的工作速度非常慢(比如 70.000 个字符串需要 190.000 毫秒)。 我测量(使用 Stopwatch())它的第一部分是最慢的部分:

public static List<WordDouble> MostFrequentWords(double count, string[] words)
    {                     
        var wordsAndNumbers = new List<WordDouble>();

        foreach (var word in words)
        {
            if (wordsAndNumbers.Exists(e => e.Word == word.ToLower()))
                wordsAndNumbers[wordsAndNumbers.FindIndex(e => e.Word == word.ToLower())].Count++;
            else
            {
                var addWord = new WordDouble();
                addWord.Word = word.ToLower();
                addWord.Count = 1;
                wordsAndNumbers.Add(addWord);
            }
         }     

/*method goes on, other parts work fast and do not need improvement */
...
return something;
}

public class WordDouble
    {
        public string Word;
        public double Count;
    }

如何提高此方法的性能?

最佳答案

在列表中使用 Exists 检查项目是 O(n) 操作,而在字典中检查项目是 O(1) 操作。

这只用了一小部分时间(实际上是大约 1/2200 的时间):

Dictionary<string, int> wordsAndNumbers = new Dictionary<string, int>();

foreach (string word in words) {
  if (wordsAndNumbers.ContainsKey(word.ToLower())) {
    wordsAndNumbers[word.ToLower()]++;
  } else {
    wordsAndNumbers.Add(word.ToLower(), 1);
  }
 }

下面是使用 70000 个字符串测试运行的结果,分别针对原始代码、我的代码和控制台的代码:

00:01:21.0804944
00:00:00.0360415
00:00:00.1060375

您甚至可以通过在循环中仅执行一次 ToLower 来加快速度:

var wordsAndNumbers = new Dictionary<string, int>();

foreach (var word in words) {
  string s = word.ToLower();
  if (wordsAndNumbers.ContainsKey(s)) {
    wordsAndNumbers[s]++;
  } else {
    wordsAndNumbers.Add(s, 1);
  }
}

测试运行:

00:00:00.0235761

关于c# - 加快在 C# 中处理大字符串数组的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29961279/

相关文章:

c# - 使用 MVC 和 Entity Framework 实现审计日志/更改历史记录

c# - 当鼠标光标悬停在 WPF 中的按钮上时,如何显示工具提示

python - 在 python 中沿着列表复制元素

c# - 有没有办法以 2-3 mbps 的速度使用串行端口?

c# - 单声道 GTK# : Trying to remove text in ComboBox and then prepend new text to the ComboBox but some of the old text remains

c# - C# 是否具有零成本抽象?

python - 将不同的列表数据类型连接成字符串

list - 查找列表中元素的索引

python - Python 中的 Perl qw 运算符?

更改c中链表中的索引