今天有個需求,要將某目錄下的圖檔清單轉成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@@ 簡潔對我來說就是親和

Post a comment