Coding Smarter Tips 1 - String
5 |
身為程式老鳥,程式寫多了,總會發展出自己處理某些邏輯的一套慣用方法,有些演算法觀念甚至還跨語言: 在VBScript時代想出來的演算法,轉換成C#後,一樣在.NET上虎虎生風。
觸類旁通、得心應手的快意,其實也讓老鳥們喪失了一部份探索新語言、學習新工具的樂趣 --- 其實新語言、新工具已經提供了更快速簡潔的處理方法,當你總能用舊方法打發問題,無形中也忽略進化到用更少程式碼完成相同工作的機會。
以我自己的經驗來說,近年來已少有耐心好好地翻完一本書,新語言、新工具的學習總依賴Google,要用了才臨時去找。沒有靜下心來全面了解熟悉語言工具的後果,即使有能力寫Code解決各式各樣的難題,卻往往不是最更效率、更嚴謹的解題方法。於是我常常在Trace別人的Code時,或是經由旁人的提醒,才知道自己用了幾年的方法,其實是個愚公移山的笨方法,根本可以用一行打死。(一個典型的例子在這裡)
【Coding Smarter系列】搜集了我陸續發現處理常用作業的"最佳".NET實作方法跟大家分享。也歡迎大家來踢館,讓我學到更棒的方法!!
1: //需求1: 將CheckBoxList中選取的項目Value用分號串起來
2:
3: //老方法,跑迴圈,第一筆資料不加;
4: StringBuilder sb = new StringBuilder();
5: foreach (ListItem item in CheckBoxList1.Items)
6: {
7: if (!item.Selected) continue;
8: if (sb.Length > 0) sb.Append(";");
9: sb.Append(item.Value);
10: }
11: Response.Write(sb.ToString());
12:
13: //改良法1,不花功夫決定加不加分號,最後再移除多餘的分號
14: sb = new StringBuilder();
15: foreach (ListItem item in CheckBoxList1.Items)
16: if (item.Selected)
17: sb.AppendFormat("{0};", item.Value);
18: //直接用TrimEnd移掉多餘的分號
19: Response.Write(sb.ToString().TrimEnd(';'));
20:
21: //改良法2,利用Join
22: List<string> lst = new List<string>();
23: foreach (ListItem item in CheckBoxList1.Items)
24: if (item.Selected) lst.Add(item.Value);
25: //string.Join會將陣列組裝成字串
26: Response.Write(string.Join(";", lst.ToArray()));
27:
28: //需求2 將數字補零至四位
29: int i = 5;
30:
31: //VBScript常見做法
32: string s = "0000" + i.ToString();
33: //VB.NET還可用RIGHT$
34: Response.Write(s.Substring(s.Length - 4));
35:
36: //Format會簡單一些
37: s = string.Format("{0:0000}", i);
38:
39: //PadLeft也佷酷,還可以用在非數字上
40: s = i.ToString().PadLeft(4, '0');
Update 2007-11-13 這裡也可以寫成i.ToString("0000"); 謝謝evakey補充
最後再補充幾個好用的String Member:
- StartsWith、EndsWith: 比對字串對尾,支援不分大小寫比對。 (Update 2007-11-13 少了s, 謝謝Leem指正)
- Insert: 插入字串,不用再s.Substsring(0, i) + "AAA" + s.Substring(i)了
- IndexOf: 不只是VBScript中的Instr而已,支援不分大小寫比對。
Comments
# by r5d
字串的串接我見過另一種做法 string sep = ""; StringBuilder sb = new StringBuilder(); foreach (ListItem item in CheckBoxList1.Items) { if (!item.Selected) continue; sb.AppendFormat("{0}{1}",sep,itemValue); sep = ";" } Response.Write(sb.ToString()); 好像是在 codeproject 上偷東西的時候撿到的.
# by Jeffrey
哈!!! 這招很妙,利用設定字串變數的時機巧妙避掉第一個分號,靠時間差取勝,讓我想到排球的A式快攻,酷~~~ 謝謝分享。
# by evakey
數字補四位的另法 s = i.ToString("0000")
# by leem
不好意思,我試了StartWith、EndWith之後發覺應該是StartsWith、EndsWith,在with之前須加上字母 's',雖然試了之後就知道了,但還是跟您說一聲,請不要見怪!
# by Jeffrey
To Leem, 哈,何見怪之有? 看到有錯還不跟我說才是陷我於不義呢! 謝謝你的熱心指正。