供 List<T> 做多重條件排序的通用元件 2
前篇文章貼出沒多久,就有高手前來點出程式中待改善的地方,並給予相當實用的建議。
此篇即為重構後的版本,執行速度快約百倍。
重構後的程式
class Sort<T> : IComparer<T>
{
public static Sort<T> By(params Func<T, T, int>[] comparers)
{
return new Sort<T>(comparers);
}
public Func<T, T, int>[] Comparers { get; private set; }
public Sort(params Func<T, T, int>[] comparers)
{
Comparers = comparers;
}
public int Compare(T x, T y)
{
foreach (var c in Comparers)
{
var r = c(x, y);
if (r != 0)
return r;
}
return 0;
}
}
使用方式
static void Main(string[] args)
{
var list = new List<Item>();
list.Add(new Item("2013-10-1", "G", 6, 2100));
list.Add(new Item("2013-10-3", "D", 6, 1300));
list.Add(new Item("2013-10-3", "F", 5, 1100));
list.Add(new Item("2013-10-3", "A", 6, 1100));
list.Add(new Item("2013-10-5", "A", 7, 5100));
list.Add(new Item("2013-10-6", "A", 9, 2100));
list.Add(new Item("2013-10-7", "R", 6, 1100));
Func<Item, Item, int> date = (x, y) => x.Date.CompareTo(y.Date);
Func<Item, Item, int> qty = (x, y) => x.Qty.CompareTo(y.Qty);
Func<Item, Item, int> name = (x, y) => x.Name.CompareTo(y.Name);
Func<Item, Item, int> price = (x, y) => x.Price.CompareTo(y.Price);
Dump("[未排序]", list);
list.Sort(Sort<Item>.By(date, qty, name));
Dump("[依 Date, Qty, Name 排序]", list);
list.Sort(Sort<Item>.By(name, price));
Dump("[依 Name, Price 排序]", list);
list.Sort(Sort<Item>.By(qty, name));
Dump("[依 Qty, Name 排序]", list);
Console.ReadLine();
}