码迷,mamicode.com
首页 > 其他好文 > 详细

使用Lambda表达式扩展List.Sort()

时间:2018-03-03 01:07:16      阅读:299      评论:0      收藏:0      [点我收藏+]

标签:extend   扩展方法   lambda   read   compareto   img   使用   write   rgs   

  如果可以使用 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()

标签:extend   扩展方法   lambda   read   compareto   img   使用   write   rgs   

原文地址:https://www.cnblogs.com/yezhizhen/p/8495549.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!