有比这个函数更快的方法来比较两个字符串(使用通配符的空格)吗?
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。 (被比较的两个将需要相同的长度)
答案 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)
我认为你没有给你的代码提供一些上下文,这有点不公平。当然,如果你只想搜索与你的模式长度相同的一串字符,那么这是好的。
但是,如果你使用它作为模式匹配器的核心,你将会寻找其他几种模式,这是一种糟糕的方法。还有其他已知方法,其中最好的方法取决于您的确切应用。短语“不精确模式匹配”是您关注的短语。