身為程式老鳥,程式寫多了,總會發展出自己處理某些邏輯的一套慣用方法,有些演算法觀念甚至還跨語言: 在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, 哈,何見怪之有? 看到有錯還不跟我說才是陷我於不義呢! 謝謝你的熱心指正。

Post a comment