C# List Sort 排序用法总结
一、升序、降序
其实C#中的List的Sort函数中的比较函数CompareTo有三种结果 1, -1 ,0分别代表大,小,相等。默认List的排序是升序排序。
举个例子:在比较函数CompareTo()中,如果 x>y return 1;则是按照升序排列。如果x>y return -1;则是按照降序排列。这就是1和-1大小的含义。其实你非要这么写 x<y return 1;则也表示降序排列。不过大家一般习惯x>y return 1;升序,如果想要降序只需return -1;即可。
Tips:系统List默认的排序是升序,如果你想要降序,可以直接在比较函数前面加个负号,把返回结果由1变成-1即可。例如:
List<int>list=newList<int>(){2,1,3,4};list.Sort((x,y)=> {return -x.CompareTo(y);});Console.WriteLine(list);//4,3,2,1
二、对于非数值类型、string等或者官方未来实现IComparable接口的类型,可通过实现IComparable接口重写CompareTo方法来排序。
举个例子:自定义一个类,然后继承字: IComparable<>,然后实现接口的方法 int CompareTo(object obj_)就可以了
public class Person : IComparable<Person>
{
public int id;
public string name;
public Person()
{
id = 0;
name = "name";
}
public Person(int id_, string name_)
{
id = id_;
name = name_;
}
public int CompareTo(Person obj_)
{
if (this.id > obj_.id)
return 1;
else
return -1;
}
}
三、多权重排序
其实就是对优先级最高的字段进行排序,然后在对次级优先级的字段进行排序就可以了。例如对Persond的对象先进行ID排序,然后再进行Name排序:
public int CompareToIDName(Person x_, Person y_)
{
if (x_.id > y_.id)
return 1;
else if (x_.id == y_.id)
{
return x_.name.CompareTo(y_.name);
}
else
return -1;
}
四、使用匿名函数来实现Comparison
虽然想实现排序上面的接口代码也不多,但有时候只是偶尔排序,并不想修改类,怎么办呢?当然有更简单的方法,委托和lambda表达式:
public void Init()
{
m_personList.Add(new Person(10001, "Zhao"));
m_personList.Add(new Person(10006, "Qian"));
m_personList.Add(new Person(10006, "Zhao"));
m_personList.Add(new Person(10004, "Li"));
m_personList.Add(new Person(10006, "Zhao"));
m_personList.Sort();
m_personList.Sort(delegate (Person x, Person y)
{
if (x.id > y.id)
return 1;
else
return -1;
});
m_personList.Sort((x, y) =>
{
return x.name.CompareTo(y.name);
});
m_personList.Sort((x, y) => CompareToIDName(x, y));
}
该文章同时发布于知乎:C# List Sort 排序用法总结 - 知乎