[英]C# - fastest way to compare two strings using wildcards
有没有比这个函数更快的方法来比较两个字符串(使用通配符的空格)?
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。 (被比较的两个将需要相同的长度)
如果mask.length小于word.length,则此函数将在掩码结束时停止比较。 一开始的字/掩码长度比较可以防止这种情况,也可以快速消除一些明显的不匹配。
这看起来是一个非常好的实现 - 我认为你不会比这快得多。
您是否对此代码进行了分析并发现它是您应用程序中的瓶颈? 我认为这对大多数用途都应该没问题。
循环非常简单,我不确定你能做得更好。 您可以在if语句中微观优化表达式的顺序。 例如,由于&&的短路,以这种方式订购if语句可能会更快
if (mask[index]!= word[index])) && (mask[index] != ' ')
假设匹配字符比匹配通配符更常见。 当然这只是理论,如果不对它进行基准测试,我认为它不会产生影响。
正如其他人指出的那样,如果掩码和字符串的长度不同,例程就会失败。
如果你用过.
代替 ,你可以做一个简单的正则表达式匹配。
可变长度比较:我使用您的代码作为我自己的应用程序的起始位置,假设掩码长度短于或等于比较文本长度。 允许掩码中的可变长度通配符点。 即:“concat”将匹配“c ncat”或“ct”或甚至“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;
}
不确定这是否更快但它看起来很整洁:
public static bool CustomCompare(this string word, string mask)
{
return !mask.Where((c, index) => c != word[index] && c != ' ').Any();
}
我认为你没有给你的代码提供一些上下文,这有点不公平。 当然,如果你只想搜索与你的模式长度相同的一串字符,那么是的,这很好。
但是,如果你使用它作为模式匹配器的核心,你将会寻找其他几种模式,这是一种糟糕的方法。 还有其他已知方法,其中最好的方法取决于您的确切应用。 短语“不精确模式匹配”是您关注的短语。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.