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