【C#】 自定义类的比较/排序—IComparer接口、IComparable接口
排序
数组
https://learn.microsoft.com/en-us/dotnet/api/system.array.sort?view=net-7.0
using System;
Array.Sort(Array); //使用默认比较器
Array.Sort(Array, IComparer); //使用自定义比较器
定义一个比较器类MySort,继承IComparer接口实现Compare方法,将实例传入Sort函数:
返回值1,将y放在x的左侧
-1将y放在x的右侧
1保持位置不变
不知道怎么写返回值时,写一个调试一下就知道,错了改一下就行。
class mySort: IComparer
{
#region IComparer Members
public int Compare(object x, object y)
{
Student s1 = x as Student;
Student s2 = y as Student;
//return s1.Name.CompareTo(s2.Name); //默认CompareTo为升序
if(s1.Age < s2.Age)
return 1; //将s2放在s1的左侧,这里s2.Age>s1.Age,所以按Age降序
else if(s1.Age == s2.Age)
return 0;
else
return -1;
}
#endregion
}
static void Main(string[] args)
{
Person[] p = new Person[]{
new Person(10,"zhang"),
new Person(30,"wang"),
new Person(40,"fang"),
new Person(20,"lang"),
};
Array.Sort(p, new MySort());
foreach(var ii in p){
Console.WriteLine($"age={ii.Age},name={ii.Name}");
}
}
class MySort: IComparer
{
#region IComparer Members
public int Compare(object x, object y)
{
Person s1 = x as Person;
Person s2 = y as Person;
if(s1.Age < s2.Age)
return 1;
else if(s1.Age==s2.Age)
return 0;
else
return -1;
}
#endregion
}
public class Person
{
public int Age{set;get;}
public string Name{set;get;}
public Person(int a, string n){
this.Age=a;
this.Name=n;
}
}
定义数据类型时继承IComparable接口实现CompareTo方法
这时该数据类型的集合,调用Sort()排序时将按照CompareTo方法指定排序规则进行排序。
int、string、object类型可用CompareTo方法,默认升序。
public class Person:IComparable
{
public int Age{set;get;}
public string Name{set;get;}
public Person(int a, string n)
{
this.Age=a;
this.Name=n;
}
public int CompareTo(object oo)
{
Person pp = oo as Person;
if (Age < pp.Age)
{
return -1;
}
else if (Age == pp.Age)
{
return 0;
}
else
{
return 1;
}
//return this.Age.CompareTo(pp.Age); //Int.CompareTo()默认升序
}
}
List
using System.Collections.Generic;
Sort(); //使用默认比较器
Sort(IComparer<T>); //使用自定义比较器
List<Person> ll = new List<Person>();
ll.Add(new Person(10,"zhang"));
ll.Add(new Person(20,"wang"));
ll.Add(new Person(30,"fang"));
ll.Add(new Person(40,"lang"));
ll.Sort();