用List.Sort(泛型 Comparison) 處理string混合integer的排序問題

  • 7981
  • 0
  • C#
  • 2008-12-31

今天看到小舖有人寫了一個問題要問

問題是這樣的

今天看到小舖有人寫了一個問題要問

問題是這樣的

 


private List<string> _temp = new List<string>();
private void parseNumber(string numbers)
{
_temp.Add("A1");
_temp.Add("A51");
_temp.Add("A13");
_temp.Add("A100");
_temp.Sort();
}

事實上這樣foreach出來會呈現

A1
A100
A13
A51

並不會A1,A13,A51,100這樣排列

bibby大大提供了一個解決方法


var result = _temp.OrderBy(a => Convert.ToInt32(a.Substring(1, a.Length - 1)));
foreach (string str in result)
{
        Response.Write(str + "<br/>");
}

可是事實上很多專案現在都還是.NET2.0阿

bibby大大的lambda就不是每種情況都能派上用場了

然後bibby大大又叫我用delegate來取代一下他的超好用lambda

所以cloudio就另外寫了個傳入Comparison做排序的參數來解這個排序的題目

會比lambda長一點,先說好:P

 


_temp.Sort(new Comparison<string>(delegate(string i, string y) {
    int o, p;
    int.TryParse(i.Substring(1, i.Length - 1), out o);
    int.TryParse(y.Substring(1, y.Length - 1), out p);
    return o.CompareTo(p);
}));

其實這個delegate也可以寫成一個固定的method來處理這種會包含英文單字的字串

這樣就會比這個範例的只能處理第一個字是英文的字串更能reuse了