当你调用 List< T >.Sort 方法时,如果类型 T 实现了 IComparable< T > 接口,那么列表中的元素会根据该接口定义的排序规则进行排序。如果没有实现 IComparable< T > 接口,但是实现了 IComparable 接口,那么也会使用 IComparable 接口的排序规则。如果类型 T 既没有实现 IComparable< T > 也没有实现 IComparable,那么在尝试排序时会抛出 InvalidOperationException 异常。
1. 无参数形式
list.Sort();
这要求 T 实现了 IComparable< T > 接口。列表会根据元素的自然顺序进行排序。
2. 带有比较器的形式
list.Sort(IComparer<T> comparer);
这里你可以传入一个实现了 IComparer 接口的比较器,用于定义排序规则。
3. 带有比较函数的形式(C# 2.0 及更高版本):
list.Sort(Comparison<T> comparison);
你可以传入一个比较函数,该函数定义了两个元素之间的排序关系。比较函数应该返回一个整数,小于 0 表示第一个元素小于第二个元素,等于 0 表示两个元素相等,大于 0 表示第一个元素大于第二个元素。
以下为UGUI源码中的一个例子
private static readonly Comparison<ICanvasElement> s_SortLayoutFunction = SortLayoutList;
private void PerformUpdate()
{
.......
m_LayoutRebuildQueue.Sort(s_SortLayoutFunction);
.......
}
private static int SortLayoutList(ICanvasElement x, ICanvasElement y)
{
Transform t1 = x.transform;
Transform t2 = y.transform;
return ParentCount(t1) - ParentCount(t2);
}
4. 带有索引和计数的形式(C# 2.0 及更高版本):
list.Sort(int index, int count, IComparer<T> comparer);
list.Sort(int index, int count, Comparison<T> comparison);
这些重载允许你对列表中的一部分元素进行排序,而不是整个列表。
示例
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
List<Person> people = new List<Person>
{
new Person { Name = "Alice", Age = 30 },
new Person { Name = "Bob", Age = 25 },
new Person { Name = "Charlie", Age = 35 }
};
// 使用无参数 Sort 方法(要求 Person 实现 IComparable<Person>)
people.Sort((x, y) => x.Age.CompareTo(y.Age));
// 或者使用带有比较器的 Sort 方法
people.Sort(Comparer<int>.Default.CompareTo(p1.Age, p2.Age)); // 这里需要一个适当的转换或包装来适应 IComparer<Person>
// 另一种方式是让 Person 类实现 IComparable<Person> 接口
public class Person : IComparable<Person>
{
// ... 省略其他代码
public int CompareTo(Person other)
{
if (other == null) return 1;
return this.Age.CompareTo(other.Age);
}
}
// 然后可以直接调用无参数的 Sort 方法
people.Sort();