LINQ應用實例-對字串陣列元素逐一做處理
1 |
今天有個需求,要將某目錄下的圖檔清單轉成Javascript字串陣列,以方便網頁處理。例如: B:\100311\目錄下有F1.gif, F2.gif, F3.gif三個圖檔,便要產出var data = ["F1.gif","F2.gif","F3.gif"];,心血來潮,分別列出傳統組字串寫法、String.Join及應用LINQ概念的程式碼比較一番。
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
//傳統寫法
sb.Append("var data = [");
bool addComma = false;
foreach (string f in Directory.GetFiles("B:\\100311", "*.gif"))
{
string pureFileName = Path.GetFileName(f);
sb.AppendFormat("{0}\"{1}\"", addComma ? "," : "", pureFileName);
addComma = true;
}
sb.Append("];");
Debug.WriteLine(sb.ToString());
//用String.Join
sb.Length = 0;
sb.Append("var data = [");
List<string> l = new List<string>();
foreach (string f in Directory.GetFiles("B:\\100311", "*.gif"))
l.Add("\"" + Path.GetFileName(f) + "\"");
sb.Append(string.Join(",", l.ToArray()));
sb.Append("];");
Debug.WriteLine(sb.ToString());
//使用LINQ概念,程式碼可以簡化成一行
string r = "var data = [" +
string.Join(",",
Directory.GetFiles("b:\\100311", "*.gif")
//利用Select()對陣列做處理,只保留檔名部分,前後加上雙引號
.Select(s => "\"" + Path.GetFileName(s) + "\"")
//轉回字串陣列
.ToArray()) + "];";
Debug.WriteLine(r);
Console.Read();
}
Directory.GetFiles()傳回的string[],在.NET 3.5中可呼叫Select()配合Lambda表示法,直接將檔名中的路徑部分去掉,並在前後加上雙引號後,再透過.ToArray()傳回處理過的字串陣列,這樣就連foreach迴圈都免了。
程式碼變簡潔了(一行搞定,連StringBuilder都用不到),但看懂Code的門檻也變高,簡潔度及親和性如何取捨,大家再視狀況自行斟酌吧!
Comments
# by Phoenix
三種Code要看懂花的時間覺得差不多, 不過我討厭看很多Code@@ 簡潔對我來說就是親和