【发布时间】:2015-05-01 05:38:00
【问题描述】:
此方法从字符串数组中获取最常用的单词。 对于大型数组(例如 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;
}
如何提高此方法的性能?
【问题讨论】:
-
Code Review 将是您提问的更好地方。
-
你听说过Dictionary吗?
-
并不是说它会有很大的不同,而是为
word.ToLower()创建一个变量,并在 3 个使用它的地方使用该变量 -
使用ToLower可以通过一个word.Equals(e.Word, StringComparison.CurrentCultureIgnoreCase);正如已经提到的使用字典,您也可以为字典指定 StingComparison
-
stackoverflow.com/questions/2655759/… 显示了具有合理性能的代码 - 采用字符串应该很简单,因为它是 GroupBy/OrderBy 的基本组合