gpt4 book ai didi

c# - 迭代数千个元素列表

转载 作者:行者123 更新时间:2023-11-30 23:24:59 25 4
gpt4 key购买 nike

case 15: {
for (int i = 0; i < words.Count; i++) {
if (words[i].Length == 8) {
var tupled = words[i].ConcatCheck();
for (int n = 0; n < word.Count; n++)
if (word[n] == tupled.Item1 || word[n] == tupled.Item2)
temp++;
}
if (temp >= 2)
matches.Add(words[i]);
temp = 0;
}
break;
}

它的作用:
第一个“for 循环”遍历一个约 248000 个元素长的单词 List,检查长度为 8 的单词。找到一个后,我通过调用 ConcatCheck() 方法(一种扩展方法 I为 obj String 写的)。那部分又快又好。

真正需要改进的是第二个“for 循环”。每一个 8 个字母的单词都会激活此循环,循环遍历包含大约 267000 个元素的更大的 List,检查 Tuple 的两个 Items 是否存在。如果两者都找到了,我将原始单词添加到列表“匹配项”中。

这部分需要将近 3 分钟才能找到我拥有的 248k 词典中的所有匹配项。有什么方法可以优化/加速它吗?

最佳答案

如果您只是想检查某个单词是否存在于集合中,请使用 HashSet 而不是 ListArrayHashSet 类针对Contains 检查进行了优化。

示例

通过以下代码,我在 english dictionary (github version) 中找到了由两个 4 字母单词组成的所有 8 字母单词。 不到 50 毫秒

WebClient client = new WebClient();
string dictionary = client.DownloadString(
@"https://raw.githubusercontent.com/dwyl/english-words/master/words.txt");

Stopwatch watch = new Stopwatch();
watch.Start();

HashSet<string> fourLetterWords = new HashSet<string>();

using (StringReader reader = new StringReader(dictionary))
{
while (true)
{
string line = reader.ReadLine();
if (line == null) break;
if (line.Length != 4) continue;

fourLetterWords.Add(line);
}
}

List<string> matches = new List<string>();

using (StringReader reader = new StringReader(dictionary))
{
while (true)
{
string line = reader.ReadLine();
if (line == null) break;
if (line.Length != 8) continue;

if (fourLetterWords.Contains(line.Substring(0, 4)) &&
fourLetterWords.Contains(line.Substring(4, 4)))
matches.Add(line);
}
}

watch.Stop();

为什么你的代码这么慢?

for (int n = 0; n < word.Count; n++)
if (word[n] == tupled.Item1 || word[n] == tupled.Item2)
temp++;

这部分是罪魁祸首之一。不是检查 Are both parts contained in my array? 你正在检查 Are 2 or more of my 2 words contained in an array?

一旦找到这两个词,您就可以通过打破循环来优化这部分。

if (word[n] == tupled.Item1 || word[n] == tupled.Item2)
if(++temp >= 2) break;

可以通过按长度或字母顺序对单词进行预排序来进一步优化(取决于您运行此搜索的频率)。

关于c# - 迭代数千个元素列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37510883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com