供 List<T> 做多重條件排序的通用元件 2

  • 1135
  • 0

供 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();
}