簡體   English   中英

c#為字符串中的某些字符添加轉義的有效方法

[英]c# efficient way to add an escape for some characters in a string

我需要用\加上原始字符替換字符串中的一些字符

所以給那字符串和數組

string origin = "words&sales -test\strange";
string[] specialChars = new string[]{"\", "&", "-", "?",......}; 

我想得到

"words\&sales \-test\\strange"

注意\本身是一個要查找和替換的字符

謝謝

一般來說,在 C#/.NET 中構建String值的最快方法是使用StringBuilder ,即使您正在轉換另一個String值。

另一個問題是確定哪些 char 值應該轉義或不轉義的“最佳”方法:如果可轉義字符集在編譯時固定,則使用switch()語句,因為它將被編譯為本機跳轉-table,這比使用運行時HashSet<Char>來確定集合成員身份要快:

例如:


static String Escape( String input )
{
    StringBuilder sb = new StringBuilder( capacity: 5 * input.Length / 4 ); // Assuming 25% length increase due to escaping.

    foreach( Char c in input )
    {
        switch( c )
        {
        case '\\':
        case '&':
        case '-':
        case '?':
            _ = sb.Append( '\\' ).Append( c );
            break;
        default:
            _ = sb.Append( c );
            break;
        }
    }

    return sb.ToString();
}

如果在運行時定義了可轉義字符集,那么使用HashSet<Char>可能是最好的整體選擇 - 盡管如果您知道您只處理有限范圍內的 Unicode 代碼點的字符(比如 ASCII 兼容字符在0x00 to 0x7F范圍內),那么您可以使用Boolean[127]數組來存儲轉義標志映射。

使用HashSet<Char> ,它會是這樣的:

static String Escape( String input, IEnumerable<Char> escapableChars )
{
    HashSet<Char> escapeThese = new HashSet<Char>( escapableChars );

    StringBuilder sb = new StringBuilder( capacity: 5 * input.Length / 4 ); // Assuming 25% length increase due to escaping.

    foreach( Char c in input )
    {
        if( escapeThese.Contains( c ) )
        {
            _ = sb.Append( '\\' ).Append( c );
        }
        else
        {
            _ = sb.Append( c );
        }
    }

    return sb.ToString();
}

當然,上面的代碼還可以進一步優化:一些建議:

  • 首先檢查String input是否有任何可轉義的字符:如果沒有任何字符是可轉義的,則直接返回input而不創建新的StringBuilder
  • 創建一個(按需) StringBuilder實例池,而不是在每次調用時創建新實例。
  • 允許ReadOnlySpan<Char>而不是String用於輸入並將輸出寫入Span<Char> - 您需要一個初始步驟來計算Span<Char>所需的最小大小,然后將該信息傳遞回調用者。
    • 可以進行相同的最小尺寸計算以獲得完全正確的capacity: StringBuilder的值而不是我的(懶惰的)25% 估計。
  • 添加記憶:使用布隆過濾器和由input值鍵入的輸出緩存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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