gpt4 book ai didi

C# - 使用扩展方法排序

转载 作者:可可西里 更新时间:2023-11-01 08:57:56 25 4
gpt4 key购买 nike

我想对 person say 的列表进行排序

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));

基于

public enum CompareOptions
{
ByFirstName,
ByLastName,
BySalary
}

public enum SortOrder
{
Ascending,
Descending
}

使用 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});
}

最佳答案

看起来您正试图在 List<T> 上调用 Sort 方法这需要 Comparison<T>代表。这将需要一些工作,因为您首先必须定义一个兼容的比较函数。

第一步是根据 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();
}
}

默认情况下,此函数将按升序排序。如果您希望它下降,只需取反该值即可。所以现在写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);
}

编辑

100% 在 lambda 中完成的版本

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;
});
}

关于C# - 使用扩展方法排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1827719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com