c#字串連線常用的四種方式:stringbuilder、+、string.format、list。
1.+的方式
string sql = "update tablename set int1=" + int1.tostring() + ",int2=" + int2.tostring() + ",int3=" + int3.tostring() + " where id=" + id.tostring();
編譯器會優化為:
string sql = string.concat(new string );
下面是string.concat的實現:
public
static
string
concat(
params
string
values)
string
strarray =
newstring
[values.length];
for(
inti =
0; i < values.length; i++)
}return
concatarray(strarray, totallength);
}private
static
string
concatarray(
string
values,
inttotallength)
return
dest;
}private
static
unsafe
void
fillstringchecked(
string
dest,
intdestpos,
string
src)
fixed
(char
* chref = &dest.m_firstchar)}}
先計算目標字串的長度,然後申請相應的空間,最後逐一複製,時間複雜度為o(n),常數為1。固定數量的字串連線效率最高的是+。但是字串的連+不要拆成多條語句,比如:
string sql = "update tablename set int1=";
sql += int1.tostring();
sql += ...
這樣的**,不會被優化為string.concat,就變成了效能殺手,因為第i個字串需要複製n-i次,時間複雜度就成了o(n^2)。
2.stringbuilder的方式
如果字串的數量不固定,就用stringbuilder,一般情況下它使用2n的空間來保證o(n)的整體時間複雜度,常數項接近於2。
因為這個演算法的實用與高效,.net類庫裡面有很多動態集合都採用這種犧牲空間換
取時間的方式,一般來說效果還是不錯的。
3.string.format的方式
它的底層是stringbuilder,所以其效率與stringbuiler相似。
4.list它可以轉換為string後使用string.concat或string.join,很多時候效率比stringbuiler更高效。
list與stringbuilder採
用的是同樣的動態集合演算法,時間複雜度也是o(n),與stringbuilder不同的是:list的n是字串的數量,複製的是字串的引用;stringbuilder的n是字串的長度,複製的資料。不同的特性決定的它們各自的適應環
境,當子串比較大時建議使用list,因為複製引用比複製資料划算。而當子串比較小,比如平均長度小於8,特別是乙個乙個的字元,建議使用stringbuilder。總結:
1>固定數量的字串連線+的效率是最高的;
2>當字串的數量不固定,並且子串的長度小於8,用stringbuiler的效率高些。
3>當字串的數量不固定,並且子串的長度大於8,用list的效率高些。
問題 A 字串連線
不借用任何字串庫函式實現無冗餘地接受兩個字串,然後把它們無冗餘的連線起來。每一行包括兩個字串,長度不超過100。可能有多組測試資料,對於每組資料,不借用任何字串庫函式實現無冗餘地接受兩個字串,然後把它們無冗餘的連線起來。輸出連線後的字串。abc def abcdef include const in...
問題 A 字串連線
題目描述 不借用任何字串庫函式實現無冗餘地接受兩個字串,然後把它們無冗餘的連線起來。輸入每一行包括兩個字串,長度不超過100。輸出可能有多組測試資料,對於每組資料,不借用任何字串庫函式實現無冗餘地接受兩個字串,然後把它們無冗餘的連線起來。輸出連線後的字串。樣例輸入 copy abc def 樣例輸出...
c 字串連線
string name nihao string spa string str str 常量字串 kowin 常量字串不能直接相加,報錯 str 常量字串 name kowin 可在兩常量字串中間或開頭加變數字串即可 cout cout int n 10 char num 10 str1 str1 ...