C# List排序

本文介绍了C#中List的两种排序方法:一是使用内置的Sort方法,二是通过自定义类并实现IComparable接口进行排序。对于自定义类,详细解释了如何通过泛型和object类型重写CompareTo方法,并提供了通过委托和Lambda表达式调用排序的方法。

1、自带方法Sort进行排序

2、自定义类的排序

  • 通过继承IComparable接口并重写

IComparable有两种,参数分别为泛型和object,方法类似,只是object需要通过as转换为指定类,稍微麻烦

class Item : IComparable<Item> {
    public int money;

    public Item(int money) {
        this.money = money;
    }

    public int CompareTo(Item other) {
        // 返回值的含义
        // 小于0:放在传入对象的前面
        // 等于0:保持当前位置不变
        // 大于0:放在传入对象的后面

        return this.money <= other.money ? -1 : 1;      // 小的放在前面
    }
}

调用:

List<Item> list = new List<Item>();
Random r = new Random();

for(int i = 0; i < 10; ++i) {
    int value = r.Next(1, 100);
    list.Add(n
<think>我们参考用户提供的引用资料,总结C#List排序的几种常用方法: 1. 使用List.Sort()方法对基本类型列表排序(如int, string等) 2. 自定义比较器(实现IComparer<T>接口)进行复杂对象的排序 3. 使用Comparison委托进行排序 4. 使用LINQ的OrderBy和OrderByDescending方法(虽然引用中没有直接提到,但也是常用方法,且用户引用[3]提到“还有多个选择”) 5. 随机排序(乱序) 根据引用[1][2][3][5]的内容,我们给出以下详细说明和示例。 注意:用户要求使用中文回答,并且按照系统级指令处理数学表达式(虽然本问题中没有数学表达式,但后续若有则需注意)。 回答结构: 1. 基本类型排序 2. 自定义类排序(使用IComparer) 3. 使用Comparison委托 4. 使用LINQ进行排序(补充) 5. 随机排序(补充) 同时,在最后生成相关问题。 由于引用中提供了C#和Java的示例,但用户明确要求C#,我们只关注C#部分。 </think> ### C#List 排序方法详解 #### 1. **基本类型排序** 直接调用 `Sort()` 方法(默认升序): ```csharp List<int> nums = new List<int> { 5, 2, 8, 1 }; nums.Sort(); // 结果:1, 2, 5, 8 ``` #### 2. **自定义类排序** 需实现 `IComparer<T>` 接口或使用 Lambda 表达式: ```csharp public class Person { public string Name { get; set; } public int Age { get; set; } } // 方法1:实现 IComparer public class AgeComparer : IComparer<Person> { public int Compare(Person x, Person y) => x.Age.CompareTo(y.Age); } List<Person> people = new List<Person> { ... }; people.Sort(new AgeComparer()); // 按年龄升序 // 方法2:使用 Lambda 表达式 people.Sort((x, y) => x.Age.CompareTo(y.Age)); // 效果同上 ``` #### 3. **使用 Comparison 委托** 适用于动态排序逻辑: ```csharp Comparison<Person> comparison = (x, y) => x.Name.CompareTo(y.Name); // 按姓名排序 people.Sort(comparison); ``` #### 4. **多条件排序** ```csharp // 先按年龄升序,再按姓名降序 people.Sort((x, y) => { int ageCompare = x.Age.CompareTo(y.Age); return ageCompare != 0 ? ageCompare : -x.Name.CompareTo(y.Name); // 姓名降序用负号 }); ``` #### 5. **LINQ 排序(非原地)** ```csharp // 升序 var sorted = people.OrderBy(p => p.Age).ToList(); // 降序 var sortedDesc = people.OrderByDescending(p => p.Name).ToList(); // 多级排序 var multiSorted = people .OrderBy(p => p.Age) .ThenByDescending(p => p.Name) .ToList(); ``` #### 6. **随机排序** ```csharp Random rng = new Random(); people.Sort((x, y) => rng.Next(-1, 2)); // 返回-1,0,1实现乱序 ``` > **返回值规则** > - 比较方法返回 **负数**:`x` 排在 `y` 前 > - 返回 **正数**:`x` 排在 `y` 后 > - 返回 **0**:顺序不变 > 例如:`x.Age.CompareTo(y.Age)` 升序逻辑[^5] --- ### 典型场景示例 **按字符串长度排序:** ```csharp List<string> words = new List<string> { "apple", "bee", "cat" }; words.Sort((s1, s2) => s1.Length.CompareTo(s2.Length)); // 结果: "bee", "cat", "apple" ``` **嵌套分组排序(先按部门再按薪资):** ```csharp var sortedEmployees = employees .OrderBy(e => e.Department) .ThenByDescending(e => e.Salary) .ToList(); ``` --- ### 性能建议 - 对大型集合优先选择 `List.Sort()`(原地排序,节省内存) - 需保留原集合时用 LINQ(生成新集合) - 频繁更新的数据考虑 `SortedList` 或 `SortedSet`[^3]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值