对与集合类都有sort()这个方法,但是这个方法不是让你想用就能用的,对与一般的数据类型,你把
sort()这妹子喊过来,在复杂的排序,他都能给你搞定.但是对与类和结构,这姑娘好像就力不从心了,好像在说,你百度的,你不知道我需要有比较的参照吗.
于是乎最求sort()这妹子们帅哥们就老老实实的继承了 IComarable接口,这个接口的实现起始很简单CompareTo()方法返回1 0 -1
public class Person:IComparable<Person>
public int CompareTo(Person other)
{
if(other==null) return 1;
int result=string.Compare(this.LastName,other.LastName)
if(result==0)
{
result=string.Compare(this.FirstName,other.FirstName)
}
return result;
}
够each吧,说白了就是传进来一个类的引用和当前的引用拿出来一个属性进行比较,比较相等返回0 比较不相等 返回1 或者 -1 实现升序和降序.
只要类和结构由继承 IComarable 接口 实现CompareTo()方法 sort()这妹子也不管你高帅美丑先上床在说,但是没这个,就没资格, 那iComarable为什么这么受sort的待见那,sort说哦因为IComarable接口是她不可缺少的一部分,下面我们就听听sort这妹子的分析吧:
泛型委托实现排序,sort妹子的前生
利用委托进行排序(冒泡排序 类似IComarable接口)
1 创建实现排序算法的类
public class BubbleSorter
{
static public void Sort<T>(IList<T> sortArray, Func<T, T, bool> comparison)
{ //这里定义一个Sort方法可以接受任意类型的参数 iList<T> 这个类型的集合
// Func<T, T, bool> 这个泛型委托需要执行比较的方法 输入两个T类型 返回一个bool类型
.//Sort<T>()这个方法实现了排序的功能
for (int i = 0; i < sortArray.Count - 1; i++)//循环<T>类型集合中的没个元素
{
if(comparison(sortArray[i+1],sortArray[i]))//调用委托指向方法comparison进行比较 返回
一个布尔值
{
T temp = sortArray[i];//如果比较的结果为假 将两个元素的位置进行互换
sortArray[i] = sortArray[i + 1];
sortArray[i + 1] = temp;
}
}
}
2需要进行比较的类
class Employee
{
public string Name { get; }
public decimal Salary { get; private set; }
public Employee(string name, decimal salary)
{
Name = name;
Salary = salary;
}
public override string ToString() => $"{Name},{Salary:C}";//?红色的我也没搞懂
public static bool CompareSalary(Employee e1, Employee e2) => e1.Salary < e2.Salary;
//委托所执行的方法,这句最关键用于判断是升序, 还是降序
}
}
3 客户端调用
Employee[] employees =
{
new Employee("Bugs Bunny",20000),
new Employee("Elmer Fudd",10000),
new Employee("Daffy Duck",25000),
new Employee("wild coyote",1000000.38m), //m 代表是 decimal类型数据
};
BubbleSorter.Sort(employees, Employee.CompareSalary);//进行排序,传递list集合和一个委
托指向的方法
foreach (var emloyee in employees)
{
WriteLine(emloyee);
}
最后我们把c#的内置委托类型func 拿出来根大家聊聊
Func<T, T, bool> comparison 它的方法实现时下面这个方法 ,实现两个元素的比较返回bool
值.
public static bool CompareSalary(Employee e1, Employee e2) => e1.Salary < e2.Salary;
我们看看CompareSalary方法像不像CompareTo()方法
而这个泛型委托指向了这里:
也就是 我们在使用sort()方法时,她也有一个Func<T, T, int> CompareTo 指向了IComarable 接口的CompareTo()方法. 只是在内部实现上sort 选中用的是do{ } while() 循环 ,它有一个switch判断 0 什么也不做 1或-1 调换顺序
现在知道sort()的前生 也了解它的今世,我想你也应该明白了…怎么实现CompareTo方法了吧.
如果你对Func<T, T, int>不了解,你的花点时间了解.
这大哥是委托家族当之无愧的老大 ,跟着大哥打交道特比简单,大哥为人豪爽
① 不用进行 Delegate的声明 ,因为他本身就是一个 Delegate声明好的泛型委托
② Func<T,T> Dele=方法 就行 第一个T就是传入方法的参数 第二个就是返回的值
Func<string ,int > lenght=StringLenght; 看懂这个没多困难
调用他 int lenghtInt=lenght(“我就一个委托的调用”)
找他实现的方法 int StringLenght(string str)
③ C#发展了十年Delegate早下岗了,Func才是主力.

本文详细解析了C#中集合类的sort()方法如何通过IComparable接口实现自定义类的排序,介绍了泛型委托在排序算法中的应用,并通过实例展示了如何使用BubbleSorter类和Func委托进行员工薪资的升序排列。
2049

被折叠的 条评论
为什么被折叠?



