当前位置: 首页 > article >正文

C#集合排序指南:掌握自定义排序的多种方法

可以通过多种方式实现集合的自定义排序。以下是一些常见的方法:

1. 使用 List<T>.Sort 方法与自定义比较器

List<T> 类提供了一个 Sort 方法,它允许传递一个 IComparer<T> 接口的实现来自定义排序逻辑。

using System;
using System.Collections.Generic;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class PersonComparer : IComparer<Person>
{
    public int Compare(Person x, Person y)
    {
        // 按年龄升序排序
        return x.Age.CompareTo(y.Age);
        
        // 如果想按名字排序,可以这样做:
        // return x.Name.CompareTo(y.Name);
        
        // 或者,可以实现更复杂的排序逻辑
    }
}

class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { Name = "Alice", Age = 30 },
            new Person { Name = "Bob", Age = 25 },
            new Person { Name = "Charlie", Age = 35 }
        };

        people.Sort(new PersonComparer());

        foreach (var person in people)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }
    }
}

2. 使用 LINQ 的 OrderBy 方法与自定义键选择器

如果不需要就地排序(即不修改原始集合),而是想创建一个已排序的新集合,可以使用 LINQ 的 OrderBy 方法。可以传递一个键选择器函数来自定义排序逻辑。

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        var people = new List<Person>
        {
            new Person { Name = "Alice", Age = 30 },
            new Person { Name = "Bob", Age = 25 },
            new Person { Name = "Charlie", Age = 35 }
        };

        var sortedPeople = people.OrderBy(p => p.Age).ToList();

        foreach (var person in sortedPeople)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }
    }
}

如果想按多个属性排序,可以使用 ThenBy 方法:

var sortedPeople = people.OrderBy(p => p.Age).ThenBy(p => p.Name).ToList();

3. 实现 IComparable<T> 接口

如果你的类本身就应该有一个默认的排序顺序,可以让该类实现 IComparable<T> 接口。这通常用于希望类的实例在任何情况下都按照相同的逻辑排序时。

public class Person : IComparable<Person>
{
    public string Name { get; set; }
    public int Age { get; set; }

    public int CompareTo(Person other)
    {
        if (other == null) return 1;
        return this.Age.CompareTo(other.Age);
    }
}

// 然后可以直接使用 Sort 方法,不需要传递比较器
people.Sort();

注意,实现 IComparable<T> 接口时也应该重写 Object.EqualsObject.GetHashCode 方法,以保持一致性,特别是在集合操作中(如使用哈希表时)。然而,对于排序目的,只实现 IComparable<T> 就足够了。


http://www.kler.cn/a/511955.html

相关文章:

  • C语言之装甲车库车辆动态监控辅助记录系统
  • ASP.NET Core 中的 JWT 鉴权实现
  • STM32 学习笔记【补充】(十)硬件I2C读写MPU6050
  • redis性能优化参考——筑梦之路
  • [EAI-018] π0: A Vision-Language-Action Flow Model for General Robot Control
  • 基于springboot的口腔管理平台
  • 汇编学习笔记(自用)
  • LLM(3) : 浏览器录制16K的音频并上传到后端
  • UG NX二次开发(C#)-创建三维直线段并倒圆
  • 研1如何准备才能找到大厂实习?
  • Sudo命令的配置及使用
  • 【前端】CSS学习笔记(1)
  • Unity自学之旅01
  • JupyterLab 安装以及部分相关配置
  • WSL 2 自动更新 虚拟 IP 到 window hosts
  • 说说HashMap 的位操作以及HashSet的contains方法复杂度是多少?
  • std::forward实现原理与应用场景
  • Linux之socket编程(上)
  • Excel 技巧14 - 如何批量删除表格中的空行(★)
  • 工业现场数据实时采集:解锁工业智能化转型的关键
  • 深入理解Linux系统内存中文件结构以及缓冲区,模拟实现c语言库文件接口
  • 《重生到现代之从零开始的C++生活》—— 类和对象2
  • 【STM32-学习笔记-14-】FLASH闪存
  • 开源模型应用落地-工具使用篇-Spring AI-高阶用法(九)
  • 力扣203题—— 移除链表元素
  • ovs实现lb负载均衡