簡體   English   中英

C# - 使用通配符比較兩個字符串的最快方法

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM