此方法从字符串数组中获取最频繁出现的单词。 对于大数组,它的工作速度非常慢(比如 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/