代码之家  ›  专栏  ›  技术社区  ›  Gregoire

C-使用通配符比较两个字符串的最快方法

  •  4
  • Gregoire  · 技术社区  · 16 年前

    有没有比这个函数更快的方法来比较两个字符串(使用通配符的空格)?

    public static bool CustomCompare(this string word, string mask)
    {
    
        for (int index = 0; index < mask.Length; index++)
        {
            if (mask[index] != ' ') && (mask[index]!= word[index]))
            {
                return false;
            }
        }
        return true;
    }
    

    示例:“s nt nce”与“sentence”比较将返回true。(要比较的两个长度必须相同)

    7 回复  |  直到 13 年前
        1
  •  2
  •   Kevin Gale    16 年前

    这个循环很简单,我不确定你能做得更好。您可能能够在if语句中对表达式的顺序进行微优化。例如,由于&的短路,以这种方式订购if语句可能会更快

     if (mask[index]!= word[index])) && (mask[index] != ' ')
    

    假设匹配字符比匹配通配符更常见。当然,这只是一个理论,我不相信没有基准测试它会有什么不同。

    正如其他人指出的那样,如果掩码和字符串的长度不相同,那么例程就会失败。

        2
  •  3
  •   Rob Elliott    16 年前

    如果mask.length小于word.length,此函数将在mask末尾停止比较。在开始时进行单词/遮罩长度比较可以避免这种情况,而且可以快速消除一些明显的不匹配。

        3
  •  2
  •   Andrew Hare    16 年前

    这看起来是一个很好的实现——我认为您不会比这快得多。

    您是否分析了此代码并发现它是应用程序中的瓶颈?我认为这在大多数情况下都可以。

        4
  •  1
  •   Anon.    16 年前

    如果使用了 ,而不是 ,则可以进行简单的regex匹配。

    习惯于 . 而不是 ,您可以进行一个简单的regex匹配。

        5
  •  1
  •   MattC    14 年前

    可变长度比较: 我使用您的代码作为我自己的应用程序的起始位置,它假定遮罩长度较短或等于比较文本长度。允许在掩码中使用长度可变的通配符点。例如:“concat”将匹配“c nc a t”或“c t”甚至“c nc t”的遮罩。

        private bool CustomCompare(string word, string mask)
        {
            int lengthDifference = word.Length - mask.Length;
            int wordOffset = 0;
            for (int index = 0; index < mask.Length; index++)
            {
                if ((mask[index] != ' ') && (mask[index]!= word[index+wordOffset]))                
                {
                    if (lengthDifference <= 0)
                    {
                        return false;
                    }
                    else
                    {
                        lengthDifference += -1;
                        wordOffset += 1;
                    }
                }
            }
            return true;
        } 
    
        6
  •  1
  •   sparkplug Bozhidar Batsov    14 年前

    不确定这是否更快,但看起来很整洁:

    public static bool CustomCompare(this string word, string mask)
    {
         return !mask.Where((c, index) => c != word[index] && c != ' ').Any();
    }
    
        7
  •  0
  •   San Jacinto    16 年前

    我认为你没有给你的代码一点上下文,这有点不公平。当然,如果您只想搜索与模式长度相同的一个字符串,那么可以。

    但是,如果您将它用作模式匹配器的核心,其中有几个其他模式您将要查找,那么这是一种糟糕的方法。还有其他已知的方法,其中最好的方法取决于您的确切应用。短语“不精确的模式匹配”是您关心的短语。