有時(shí)候我們需要對(duì)字符串進(jìn)行修改,但是.net里面的字符串是只讀的,修改動(dòng)作會(huì)產(chǎn)生一個(gè)新的字符串,多數(shù)時(shí)候這都不是我想要的結(jié)果。不過fixed還是可以幫我們解決一部分問題的,比如.ToLower、.ToUpper、.Replace(char, char)等等,不過有個(gè)限制,就是變換前后的字符串長度不變。
public unsafe static string toLower(this string value) { if (value != null) { fixed (char* valueFixed = value) toLowerUnsafe(valueFixed, valueFixed + value.Length); } return value; } public unsafe static void toLower(char* start, char* end) { if (start != null && end > start) toLowerUnsafe(start, end); } public unsafe static void toLowerUnsafe(char* start, char* end) { while (start != end) { if ((uint)(*start - 'A') < 26) *start |= (char)0x20; ++start; } }
public unsafe static string toUpper(this string value) { if (value != null) { fixed (char* valueFixed = value) toUpperUnsafe(valueFixed, valueFixed + value.Length); } return value; } public unsafe static void toUpper(char* start, char* end) { if (start != null && end > start) toUpperUnsafe(start, end); } public unsafe static void toUpperUnsafe(char* start, char* end) { while (start != end) { if ((uint)(*start - 'a') < 26) *start -= (char)0x20; ++start; } }
public static string replace(this string value, char oldChar, char newChar) { return value != null && value.Length != 0 ? replaceUnsafe(value, oldChar, newChar) : null; } public unsafe static string replaceNotNull(this string value, char oldChar, char newChar) { return value.Length != 0 ? replaceUnsafe(value, oldChar, newChar) : value; } public unsafe static string replaceUnsafe(this string value, char oldChar, char newChar) { fixed (char* valueFixed = value) { char* start=valueFixed, end = valueFixed + value.Length; char endValue = *--end; *end = oldChar; do { while (*start != oldChar) ++start; *start = newChar; } while (start++ != end); if (endValue != oldChar) *end = endValue; } return value; }
Release實(shí)測(cè),效果還不錯(cuò),英文大小寫轉(zhuǎn)換運(yùn)行時(shí)間降到了.ToLower與.ToUpper的1/4以下,字符替換運(yùn)行時(shí)間降到了.Replace(char, char)的1/5以下,同時(shí)給垃圾回收也減少了很多壓力。當(dāng)然.ToLower與.ToUpper還是比較強(qiáng)大的,它不僅僅只是英文轉(zhuǎn)換,但是我個(gè)人只處理過英文大小寫問題。
需要注意的是,這里是直接修改字符串的數(shù)據(jù),會(huì)影響到所有相關(guān)引用,如果對(duì)影響程度沒有把握,一般建議應(yīng)用在一次性的臨時(shí)變量上。這里只是舉幾個(gè)例子,具體其它可能的字符串修改應(yīng)用就需要你自己卻發(fā)掘了。