我需要用加號替換字串中的一些\字符
所以給那字串和陣列
string origin = "words&sales -test\strange";
string[] specialChars = new string[]{"\", "&", "-", "?",......};
我想得到
"words\&sales \-test\\strange"
請注意,它\本身是一個要查找和替換的字符
謝謝
uj5u.com熱心網友回復:
一般來說,String在 C#/.NET 中構建值的最快方法是使用StringBuilder,即使您正在轉換另一個String值。
另一個問題是確定哪些 char 值應該轉義或不轉義的“最佳”方法:如果可轉義字符集在編譯時固定,則使用switch()陳述句,因為它將被編譯為本機跳轉表,這比使用運行時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();
}
如果在運行時定義了一組可轉義字符,那么使用 aHashSet<Char>可能是最好的整體選擇 - 盡管如果您知道您只處理有限范圍內的 Unicode 代碼點的字符(比如范圍內的 ASCII 兼容字符0x00 to 0x7F)那么你可以使用一個Boolean[127]陣列來存盤轉義標志圖。
使用 a 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 inputeven 是否有任何可轉義的字符:如果沒有任何字符是可轉義的,則直接回傳input而無需創建新的StringBuilder. - 創建(按需)
StringBuilder實體池,而不是在每次呼叫時創建新實體。 - 允許
ReadOnlySpan<Char>而不是String輸入并將輸出寫入Span<Char>- 您需要一個初始步驟來計算第一個所需的最小大小Span<Char>,并將該資訊傳遞回呼叫者。- 可以進行相同的最小尺寸計算以獲得完全正確的
capacity:值,StringBuilder而不是我的(惰性)25% 估計值。
- 可以進行相同的最小尺寸計算以獲得完全正確的
- 添加記憶:使用布隆過濾器和輸出快取
input值鍵控。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/490478.html
