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)
你真的需要这些枚举吗?我不认为在一个方法中封装你的搜索逻辑比使用linq方法更清晰或更干燥:
persons.OrderBy( p => p.FirstName );
persons.OrderByDescending( p => p.Salary);
Run Code Online (Sandbox Code Playgroud)
等等
| 归档时间: |
|
| 查看次数: |
6301 次 |
| 最近记录: |