C#实现集合自定义排序的三种方式

 更新时间:2025年01月24日 10:49:56   作者:AitTech  
在C#中,集合排序是一种常见的操作,它可以帮助我们对集合中的元素进行排序,C#中提供了多种集合排序方法,包括Array.Sort、List.Sort、SortedList和SortedSet等,本文给大家介绍了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.Equals 和 Object.GetHashCode 方法,以保持一致性,特别是在集合操作中(如使用哈希表时)。然而,对于排序目的,只实现 IComparable<T> 就足够了。

以上就是C#实现集合自定义排序的三种方式的详细内容,更多关于C#集合自定义排序的资料请关注脚本之家其它相关文章!

相关文章

  • C#中的并发集合Concurrent类

    C#中的并发集合Concurrent类

    这篇文章介绍了C#中的并发集合Concurrent类,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#中WPF依赖属性的正确学习方法

    C#中WPF依赖属性的正确学习方法

    这篇文章主要介绍了C#中WPF依赖属性的正确学习方法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • 详解c# PLINQ中的分区

    详解c# PLINQ中的分区

    这篇文章主要介绍了c# PLINQ中的分区的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 利用C#实现获取与监控电脑系统信息

    利用C#实现获取与监控电脑系统信息

    在C#中,获取与监控电脑系统信息通常可以通过多种方式实现,这篇文章主要为大家整理了几种常见的方法及其示例代码,希望对大家有所帮助
    2024-11-11
  • 使用C#代码修改Word文档中的内容控件

    使用C#代码修改Word文档中的内容控件

    本文介绍了如何在C#项目中使用Spire.Docfor.NET库对Word文档中的内容控件进行修改,包括修改正文、段落、表格行、单元格以及单元格内的内容控件等内容控件的具体步骤和示例代码,需要的朋友可以参考下
    2026-04-04
  • C#Button窗体常用属性及事件详解

    C#Button窗体常用属性及事件详解

    在本篇文章里小编给各位分享的是关于C#Button窗体常用属性及事件详解,需要的朋友们可以参考下。
    2020-03-03
  • C#使用HttpClient进行Post请求出现超时问题的解决及优化

    C#使用HttpClient进行Post请求出现超时问题的解决及优化

    最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也没有问题,那么问题就出在我的请求端了,所以本文给大家介绍了C# 使用HttpClient进行Post请求总是出现超时问题的优化,需要的朋友可以参考下
    2025-01-01
  • c#如何用好垃圾回收机制GC

    c#如何用好垃圾回收机制GC

    这篇文章主要介绍了c# 如何用好垃圾回收机制GC,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-08-08
  • C#新手常犯的错误汇总

    C#新手常犯的错误汇总

    这篇文章主要介绍了C#新手常犯的错误汇总,对于经验丰富的C#程序员同样具有很好的参考借鉴价值,需要的朋友可以参考下
    2014-08-08
  • WPF InkCanvas基本操作方法详解

    WPF InkCanvas基本操作方法详解

    这篇文章主要为大家详细介绍了WPF InkCanvas基本的操作方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11

最新评论