[英]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.