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

 更新时间:2020年11月16日 08:35:14   作者:Tulip123  
这篇文章主要介绍了C# 泛型集合的自定义类型排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、泛型集合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");
   }

 

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

定义一个普通类:

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);
      }

结果如下:

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

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);
    }
  }

结果如下:

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

实际使用中,经常需要对集合按照多种不同规则进行排序,这就需要定义其他比较规则,可以在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();

结果如下:

四、使用linq进行排序

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

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

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();

结果如下:

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# 泛型集合的自定义类型排序的实现的文章就介绍到这了,更多相关C# 泛型集合的自定义类型排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c# 实现发送邮件到指定邮箱

    c# 实现发送邮件到指定邮箱

    这篇文章主要介绍了c# 如何实现发送邮件到指定邮箱,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • C#并行编程之Task任务

    C#并行编程之Task任务

    这篇文章介绍了C#并行编程之Task任务,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#实现treeview绑定的方法

    C#实现treeview绑定的方法

    这篇文章主要介绍了C#实现treeview绑定的方法,包括datatable的获取与节点的操作,具有一定的参考价值,需要的朋友可以参考下
    2014-12-12
  • C#实现字符串格式化的示例代码

    C#实现字符串格式化的示例代码

    在日常编程中,经常需要对字符串进行格式化操作,以便呈现为不同的格式,本文主要为大家详细介绍了C#实现字符串格式化的相关知识,希望对大家有所帮助
    2023-12-12
  • C#使用handle实现获取占用指定文件或文件夹的进程

    C#使用handle实现获取占用指定文件或文件夹的进程

    很多时候,一些不知道啥进程,把你的文件给占用了,然后就没办法删掉或者做其他操作,如果使用Locksmith功能,就可以实现快速锁定是哪个进程在搞事情,把对应进程干掉就可以了,下面内容演示C#使用几行代码实现File Locksmith功能,需要的朋友可以参考下
    2024-09-09
  • C# textbox密码框设置方式

    C# textbox密码框设置方式

    这篇文章主要介绍了C# textbox密码框设置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • C# CM框架实现多页面管理的实例代码

    C# CM框架实现多页面管理的实例代码

    这篇文章主要介绍了C# CM框架下一行代码实现多页面管理,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • C#净化版WebApi框架的实现

    C#净化版WebApi框架的实现

    这篇文章主要介绍了C#净化版WebApi框架的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • C#不可变类型深入解析

    C#不可变类型深入解析

    这篇文章主要介绍了C#不可变类型,对于C#程序员深入理解string数据类型有很大的帮助,需要的朋友可以参考下
    2014-08-08
  • C#避免回溯方法心得

    C#避免回溯方法心得

    这篇文章主要介绍了C#避免回溯方法,以实例的形式讲述了回溯方法的弊端及解决处理方法,是非常实用的技巧,需要的朋友可以参考下
    2014-09-09

最新评论