C# List的Sort方法

当你调用 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();
上一篇:*学习记录(18)


下一篇:外贸平台开发多语言处理的三种方式