C# 泛型集合的自定义类型排序的实现

作者:Tulip123 时间:2022-11-18 20:35:32 

一、泛型集合List<T>排序

经sort方法之后,采用了升序的方式进行排列的。


List<int> list = new List<int>() { 2, 4, 1, 3, 5, -2, 0, 10 };
  Console.Write("排序前...");
  foreach (var item in list)
  {
   Console.Write(item + "\t");
  }
  list.Sort();
  Console.WriteLine();
  Console.WriteLine("排序后...");
  foreach (var item in list)
  {
   Console.Write(item + "\t");
  }

C# 泛型集合的自定义类型排序的实现

C# 泛型集合的自定义类型排序的实现 

二、对自定义类型进行排序

定义一个普通类:


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

接下来,将定义的Person实例化,排序;


List<Person> list = new List<Person>() {
       new Person(){Name="张叁",Id=1},
       new Person() {Name="李四",Id=4 },
        new Person() {Name="王五",Id=2 },
     };
     list.Sort();
     foreach (var item in list)
     {
       Console.Write(item.Id);
     }

结果如下:

C# 泛型集合的自定义类型排序的实现

C# 泛型集合的自定义类型排序的实现

在int类型中实现了IComparable,所以可以通过Sort()直接排序;

C# 泛型集合的自定义类型排序的实现

int类型是实现了IComparable这个接口的。那么如果让自定义类型Person也可以排序,那么试试实现该接口;

那么将上面的代码修改一下看看


public class Person:IComparable
 {
   public int Id { get; set; }
   public string Name { get; set; }

public int CompareTo(object obj)
   {
     Person p = obj as Person;
     return this.Id.CompareTo(p.Id);
   }
 }

结果如下:

C# 泛型集合的自定义类型排序的实现

三、对集合按照多种不同规则进行排序

实际使用中,经常需要对集合按照多种不同规则进行排序,这就需要定义其他比较规则,可以在Compare方法中定义,该方法属于IComparer<T>泛型接口,请看下面的代码:


public class PersonNameDesc : IComparer<Person>
 {
   //存放排序器实例
   public static PersonNameDesc NameDesc = new PersonNameDesc();
   public int Compare(Person x, Person y)
   {
     return System.Collections.Comparer.Default.Compare(x.Name, y.Name);
   }
 }

Compare方法的参数为要进行比较的两个同类型对象,返回值为int类型,返回值处理规则与CompareTo方法相同。其中的Comparer.Default返回一个内置的Comparer对象,用于比较两个同类型对象。

下面用新定义的这个比较器对集合进行排序:


//================对集合按照多种不同规则进行排序=========================
     List< Person > list = new List<Person>() {
       new Person(){Name="张叁",Id=1},
       new Person() {Name="李四",Id=4 },
        new Person() {Name="王五",Id=2 },
        new Person() {Name="李四",Id=6 },
        new Person() {Name="王五",Id=3 },
     };
     list.Sort(PersonNameDesc.NameDesc);
     foreach (var item in list)
     {
       Console.Write(item.Name + "\t");
     }
     Console.Read();

结果如下:

C# 泛型集合的自定义类型排序的实现

四、使用linq进行排序

sort方法的一个重载是Comparison<T>类型的参数;

C# 泛型集合的自定义类型排序的实现

那就看一下 Comparison<T>是怎么一回事吧:

C# 泛型集合的自定义类型排序的实现


List<Person> list = new List<Person>()
     {
       new Person(){Name="张叁",Id=1},
       new Person() {Name="李四",Id=4 },
       new Person() {Name="王五",Id=2 },
       new Person() {Name="李四",Id=6 },
       new Person() {Name="王五",Id=3 },
     };
     //匿名委托
     list.Sort((a, b) => a.Id - b.Id);
     foreach (Person p in list)
     {
       Console.WriteLine(p.Name + "\t" + p.Id);
     }
     Console.Read();

结果如下:

C# 泛型集合的自定义类型排序的实现


List<Person> list = new List<Person>()
     {
       new Person(){Name="张叁",Id=1},
       new Person() {Name="李四",Id=4 },
       new Person() {Name="王五",Id=2 },
       new Person() {Name="李四",Id=6 },
       new Person() {Name="王五",Id=3 },
     };
     var l = from p in list
         orderby p.Id descending
         select p;
     foreach (Person p in l)
     {
       Console.WriteLine(p.Name + "\t" + p.Id);
     }
     Console.Read();

结果如下:

C# 泛型集合的自定义类型排序的实现

今天的分享就到这里了,好久没写过博客了,加班多,太忙了,抽空复习一下基础知识;

来源:https://www.cnblogs.com/guhuazhen/p/13972430.html

标签:C#,泛型,排序
0
投稿

猜你喜欢

  • Java模拟死锁发生之演绎哲学家进餐问题案例详解

    2022-10-09 22:52:44
  • Unity实现场景漫游相机

    2023-06-15 19:08:57
  • Unity中的静态批处理和动态批处理操作

    2022-09-29 20:12:08
  • Java中的Unsafe在安全领域的使用总结和复现(实例详解)

    2023-07-30 10:58:42
  • 宝塔面板配置及部署javaweb教程(全网最全)

    2023-11-10 15:26:27
  • Java实现堆排序和图解

    2023-11-11 12:13:37
  • SpringBoot使用token简单鉴权的具体实现方法

    2022-07-10 14:23:42
  • Java类锁、对象锁、私有锁冲突测试

    2022-04-25 05:06:22
  • Spark SQL关于性能调优选项详解

    2021-11-05 22:32:56
  • 剑指Offer之Java算法习题精讲链表与字符串及数组

    2022-10-03 19:10:17
  • spring 注解如何开启声明式事务

    2023-04-09 23:07:42
  • Android编程设计模式之Builder模式实例详解

    2023-02-02 05:34:57
  • 关于通过java调用datax,返回任务执行的方法

    2023-11-28 21:26:45
  • jdbc中class.forname的作用

    2023-04-13 00:56:18
  • Java Swing组件布局管理器之FlowLayout(流式布局)入门教程

    2021-11-08 05:33:06
  • Android三种菜单实例分析

    2023-09-09 05:17:20
  • 聊聊Spring——AOP详解(AOP概览)

    2023-11-01 04:44:18
  • java 过滤器filter防sql注入的实现代码

    2023-08-30 09:56:40
  • 蓝牙原理Android代码实现

    2023-07-10 20:25:31
  • Android点击EditText文本框之外任何地方隐藏键盘的解决办法

    2022-12-19 14:24:41
  • asp之家 软件编程 m.aspxhome.com