如果可以使用 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; }
}
效果如下: