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

时间:2010-02-11 01:17:48

标签: c# string comparison

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

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 个答案:

答案 0 :(得分:3)

如果mask.length小于word.length,则此函数将在掩码结束时停止比较。在开头的字/掩码长度比较可以防止这种情况,也可以快速消除一些明显的不匹配。

答案 1 :(得分:2)

这看起来是一个非常好的实现 - 我认为你不会比这快得多。

您是否对此代码进行了分析并发现它是您应用程序中的瓶颈?我认为这对大多数用途都应该没问题。

答案 2 :(得分:2)

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

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

假设匹配字符比匹配通配符更常见。当然,这只是理论,如果不对它进行基准测试,我认为它不会产生影响。

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

答案 3 :(得分:1)

如果您使用.代替,则可以进行简单的正则表达式匹配。

答案 4 :(得分:1)

可变长度比较: 我使用您的代码作为我自己的应用程序的起始位置,假定掩码长度短于或等于比较文本长度。允许掩码中的可变长度通配符点。即:“concat”将匹配“c ncat”或“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;
    } 

答案 5 :(得分:1)

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

public static bool CustomCompare(this string word, string mask)
{
     return !mask.Where((c, index) => c != word[index] && c != ' ').Any();
}

答案 6 :(得分:0)

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

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