C# - 使用扩展方法排序

use*_*675 10 c# extension-methods

我想排序一个人说的名单

List<Person> persons=new List<Person>();
persons.Add(new Person("Jon","Bernald",45000.89));
persons.Add(new Person("Mark","Drake",346.89)); 
persons.Add(new Person("Bill","Watts",456.899));
Run Code Online (Sandbox Code Playgroud)

基于

public enum CompareOptions
 {
    ByFirstName,
    ByLastName,
    BySalary
 }

 public enum SortOrder
 {
   Ascending,
   Descending
 }
Run Code Online (Sandbox Code Playgroud)

使用lambda表达式排序的方法是什么?

    public static List<Person> SortPeople(this List<Person> lst, 
   CompareOptions opt1,SortOrder ord)

        {
           lst.Sort((p,op1,op2)=>{ how to apply lambda expression here});
        }
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 10

看起来您正在尝试调用List<T>带有Comparison<T>委托的Sort方法.这需要一些工作,因为您首先必须定义兼容的比较功能.

第一步是根据CompareOptions值编写比较函数

private static Comparison<Person> Create(CompareOptions opt) {
  switch (opt) {
    case CompareOptions.ByFirstName: (x,y) => x.FirstName.CompareTo(y.FirstName);
    case CompareOptions.ByLastName: (x,y) => x.LastName.CompareTo(y.LastName);
    case CompareOptions.BySalary: (x,y) => x.Salary - y.Salary;
    default: throw new Exception();
  }
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,此功能将按升序排序.如果你想让它下降只是否定价值.所以现在编写SortPeople可以通过以下方式完成

public static List<Person> SortPeople(
   this List<Person> list, 
   CompareOptions opt1,
   SortOrder ord) )
   var original = Create(opt1);
   var comp = original;
   if( ord == SortOrder.Descending ) {
     comp = (x,y) => -(orig(x,y));
   }
   list.Sort(comp);
}
Run Code Online (Sandbox Code Playgroud)

编辑

在lambda中100%完成的版本

public static List<Person> SortPeople(
   this List<Person> list, 
   CompareOptions opt1,
   SortOrder ord) )

   list.Sort( (x,y) => {
     int comp = 0;
     switch (opt) {
       case CompareOptions.ByFirstName: comp = x.FirstName.CompareTo(y.FirstName);
       case CompareOptions.ByLastName: comp = x.LastName.CompareTo(y.LastName);
       case CompareOptions.BySalary: comp = x.Salary.CompareTo(y.Salary);
       default: throw new Exception();
     }
     if ( ord == SortOrder.Descending ) {
       comp = -comp;
     }
     return comp;
   });
}
Run Code Online (Sandbox Code Playgroud)


Gab*_*art 6

你真的需要这些枚举吗?我不认为在一个方法中封装你的搜索逻辑比使用linq方法更清晰或更干燥:

persons.OrderBy( p => p.FirstName );
persons.OrderByDescending( p => p.Salary);
Run Code Online (Sandbox Code Playgroud)

等等