1. 程式人生 > >使用Lambda表達式擴展List.Sort()

使用Lambda表達式擴展List.Sort()

利用 ole reac 委托 接口 con com fun for

如果可以使用 List.Sort(x=>x.ID)的形式來對list進行排序,會使得代碼更優雅. 但是list中的Sort方法並不支持Lambda表達式。

Sort方法僅提供了4個重載:

技術分享圖片

著重點放在 Sort(IComparet<T> comparer) 上. 面向接口編程,使程序更有良好的拓展性.

當一個接口作為參數,那麽就要想到依賴註入.

先建立一個叫CommonComparer的泛型類,來實現IComparet接口

public class CommonComparer<T, V> : IComparer<T>
    {
        
public int Compare(T x, T y) { throw new NotImplementedException(); } }

我們的初衷是利用Lambda表達式來擴展, 所以我們要先把委托傳入進來,並且實現接口的方法,修改代碼如下:

public class CommonComparer<T, V> : IComparer<T>
    {
        private Func<T, V> keyFunc;
        public CommonComparer(Func<T, V> keyFunc)
        {
            
this.keyFunc = keyFunc; } public int Compare(T x, T y) { return Comparer<V>.Default.Compare(keyFunc(x), keyFunc(y)); // 調用 V(傳入的類型) 實例的CompareTo方法 } }

接著寫對list的擴展方法:

public static class ExtendSort
    {

        public static void Sort<T,V>(this
List<T> source, Func<T,V> func) { source.Sort(new CommonComparer<T,V>(func)); } }

建立一個Person類 以便測試:

static void Main(string[] args)
        {
            
            List<Person> p = new List<Person>();
            p.Add(new Person() { ID = 2, Name = "Neo" });
            p.Add(new Person() { ID = 1, Name = "Axe" });
            p.Sort(x => x.ID);
            foreach (var each in p)
            {
                Console.WriteLine("ID: " + each.ID);
                Console.WriteLine("名字:" + each.Name);
            }
            Console.ReadKey();
         }

class Person
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }

效果如下:

技術分享圖片

使用Lambda表達式擴展List.Sort()