【问题标题】:Looping through huge c# list with inner loops使用内部循环遍历巨大的 c# 列表
【发布时间】:2021-06-02 16:31:42
【问题描述】:

我有一个巨大的字符串列表_wordList List<string>,其中包含大约 100,000 个值。我遇到的问题是我还需要在其中有多个嵌套循环。嵌套循环也是一个列表,但其结构仅包含变量,包含大约 0-100 个值,具体取决于发生的情况

    for (int y = 0; y < _wordList.Count; y++)
    {
        string word = _wordList[y];
        for(int x = 0; x < _secondWordList.Count; x++)
        {
            if (!word.Contains(_secondWordList[x].Word) || word == _secondWordList[x].Word)
                continue;

            // do other stuff
        }
    }

这是代码的一部分,我不会发布所有代码,因为其中大部分都无关紧要,但在第二个循环中,我还有大约 2 个其他短循环,整个函数在 350-600 毫秒内完成。优化循环的最佳方法是什么? word.Contains 也会对性能产生大约 100-150 毫秒的影响。

【问题讨论】:

  • 是错字吗? compareString 在第二个(顺便说一下,也是第一个)循环中看起来是不变的,因此您可以将`if`移到嵌套循环之外。
  • 这是一个错字,我的错
  • 这些列表包含什么?你显然不是在说关于_wordList 的真相,因为你在那些“词”中搜索(至少)词,所以它们是句子,但你说的是关于第二个列表的真相吗?第二个列表是由整个单词组成的吗?
  • 如果是句子,您可以将它们拆分为单词,并根据原始单词的哈希表检查它们,但是如果您有字母汤,那么您无能为力。除非您更详细地描述如何使用它(因为现在听起来没用),否则您也不会获得任何特定领域的优化。
  • !word.Contains(_secondWordList[x].Word) || word == _secondWordList[x].Word 很奇怪,也许你的意思是... &amp;&amp; word != ...。您很可能可以通过交换条件来加快速度。

标签: c# optimization


【解决方案1】:

您似乎正在寻找文本搜索,在这种情况下,您可以从 LuceneNet 之类的项目中受益。

如果对 string.Contains() 的调用不存在并且您正在寻找完全匹配的内容,我建议您将列表交换为 hashset,因为它会在您的情况下为您带来很大的性能提升。如下所示。

static void Main(string[] args)
    {
        var wordList = new HashSet<string>(); //Assuming Initialized
        var secondWordList = new List<X>(); //Assuming Initialized

        for (var c = 0; c < secondWordList.Count; c++)
        {
            if(wordList.Contains(secondWordList[c].Word))
                continue;

            // do other stuff
        }
    }

这样,您将在较小的列表上进行迭代,并在复杂度为 O(1) 的 HashSet 中查找值,这意味着它会非常快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 2013-06-22
    相关资源
    最近更新 更多