C# List的Sort方法

news/2024/11/5 5:53:01 标签: c#

当你调用 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();

http://www.niftyadmin.cn/n/5739018.html

相关文章

Linux云计算个人学习总结(二)

高级文件系统 一、RSYNC概述 1、作用&#xff1a;快速的文件复制工具&#xff08;支持本地和远程&#xff09;&#xff0c;以及删除、查看等基本功能。 2、特点&#xff1a;支持实时&#xff08;inotify、sersync&#xff09;的增量备份工具3、模式&#xff1a;检查模式&#…

华为HarmonyOS打造开放、合规的广告生态 - 开屏广告

场景介绍 开屏广告是一种在应用启动时且在应用主界面显示之前需要被展示的广告。您需要预先为App设计一张开屏默认的Slogan图片&#xff0c;确保在未获得到开屏广告之前展示默认的Slogan&#xff0c;提供良好的用户体验。 开屏广告分为全屏开屏广告、半屏开屏广告&#xff0c…

MFC图形函数学习05——画椭圆函数

MFC中有一个专门绘制椭圆的函数&#xff0c;其参数与绘制矩形参数相同&#xff0c;实际上所绘制的椭圆就是矩形的内切圆椭圆。 一、绘制椭圆函数 原型&#xff1a;BOOL Ellipse (int x1,int y1,int x2,int y2); 参数&#xff1a;椭圆内切矩形的左上角&#xff08…

django-tidb版本说明

django-tidb 版本说明 https://github.com/pingcap/django-tidb django-python版本说明 Django 4.2 版本发行说明 | Django 文档 | Django

R语言贝叶斯:INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析

原文链接&#xff1a;R语言贝叶斯&#xff1a;INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247625527&idx8&snba4e50376befd94022519152609ee8d0&chksmfa8daad0cdfa23c6…

GitHub上传自己的项目

目录 一、安装Git插件 1&#xff09;下载 2&#xff09;安装 二、创建Gothub的创库 三、通过Git上传本地文件到Github 四、其他 1、部分指令 2、如果已经运行过git init并设置了[user]&#xff0c;下次可以直接用 一、安装Git插件 1&#xff09;下载 下载地址&#x…

如何实现视频人声分离?实用方法分享

在数字媒体技术日新月异的今天&#xff0c;视频处理已成为我们日常生活和工作中不可或缺的一部分。其中&#xff0c;视频人声分离技术凭借其独特的魅力和广泛的应用场景&#xff0c;逐渐走进了大众的视野。本文将深入探讨视频人声分离技术的原理、应用及其未来发展。 一、视频人…

DiskGenius工具扩容Mac OS X Apple APFS分区

DiskGenius是一款功能强大的磁盘分区工具&#xff0c;它支持Windows和Mac OS X系统&#xff0c;可以用于管理硬盘分区&#xff0c;包括扩容Mac OS X的Apple APFS分区。然而&#xff0c;直接使用DiskGenius来扩容Mac OS X的APFS分区可能存在一定的风险&#xff0c;因为不是专门为…