C#对集合进行排序

作者:.NET开发菜鸟 时间:2022-06-10 02:08:03 

先来看看下面List<T>泛型集合的排序例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomerSort
{
   class Program
   {
       static void Main(string[] args)
       {
           List<int> list = new List<int>();
           list.Add(1);
           list.Add(5);
           list.Add(2);
           list.Add(6);
           list.Add(3);
           list.Add(4);
           Console.WriteLine("*****排序前*****");
           foreach (var item in list)
           {
               Console.WriteLine(item.ToString());
           }

list.Sort();
           Console.WriteLine("*****排序后*****");
           foreach (var item in list)
           {
               Console.WriteLine(item.ToString());
           }

Console.ReadKey();
       }
   }
}

输出结果:

C#对集合进行排序

从上面的截图中可以看出,Sort()方法默认按照元素的大小进行从小到大的排序,为什么调用Sort()方法就能按照元素的大小进行从小到大的排序呢?其实现原理是什么呢?我们能不能自定义排序规则呢?带着这些问题,我们先来看看Sort()方法的定义,在Sort()方法上面按F12转到定义:

C#对集合进行排序

从截图中可以看出,Sort()方法使用了几个重载的方法。可以传递给它的参数有泛型委托Comparison<T> comparison和泛型接口IComparer<T> comparer,以及一个范围值和泛型接口IComparer<T> comparer。只有集合中的元素实现了IComparable<T>接口,才能使用不带参数的Sort()方法。我们在这里实现IComparer<T>接口来创建一个自定义类型的排序功能。

1、定义一个Student类,包括姓名和分数两个属性,可以按照姓名或分数进行排序,Student类定义如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomerSort
{
  public class Student
   {
       public string Name { get; set; }

public double Score { get; set; }
   }
}

2、在定义一个枚举,表示排序的种类,即是按照Name排序还是按照Score排序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomerSort
{
   /// <summary>
   /// 排序的种类
   /// </summary>
  public enum CompareType
   {
       Name,
       Score
   }
}

3、实现IComparer接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomerSort
{
   /// <summary>
   /// StudentComparer自定义排序规则类实现IComparable接口
   /// </summary>
   public class StudentComparer : IComparer<Student>
   {
       private CompareType _compareType;

/// <summary>
       /// 通过构造函数给_compareType赋值
       /// </summary>
       /// <param name="compareType"></param>
       public StudentComparer(CompareType compareType)
       {
           _compareType = compareType;
       }

/// <summary>
       /// 实现IComparer接口的Compare
       /// </summary>
       /// <param name="other"></param>
       /// <returns></returns>
       public int Compare(Student x, Student y)
       {
           if (x == null && y == null)
           {
               return 0;
           }
           if (x == null)
           {
               return -1;
           }
           if (y == null)
           {
               return 1;
           }
           switch (_compareType)
           {
               case CompareType.Name:
                   return string.Compare(x.Name, y.Name);
                   break;
               case CompareType.Score:
                   return x.Score.CompareTo(y.Score);
                   break;
               default:
                   throw new ArgumentException("无效的比较类型");
           }
       }
   }
}

4、在Main()方法中调用:

先按照Name进行排序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomerSort
{
   class Program
   {
       static void Main(string[] args)
       {
           //List<int> list = new List<int>();
           //list.Add(1);
           //list.Add(5);
           //list.Add(2);
           //list.Add(6);
           //list.Add(3);
           //list.Add(4);
           //Console.WriteLine("*****排序前*****");
           //foreach (var item in list)
           //{
           //    Console.WriteLine(item.ToString());
           //}

//list.Sort();
           //Console.WriteLine("*****排序后*****");
           //foreach (var item in list)
           //{
           //    Console.WriteLine(item.ToString());
           //}

List<Student> list = new List<Student>()
           {
               new Student()
               {
                   Name="Tom",
                   Score=98
               } ,
               new Student()
               {
                   Name="Kevin",
                   Score=69
               } ,
               new Student()
               {
                   Name="Leo",
                   Score=81
               }
           };
           Console.WriteLine("*****排序前*****");
           foreach (var item in list)
           {
               Console.WriteLine(item.Name);
           }
           list.Sort(new StudentComparer(CompareType.Name));
           Console.WriteLine("*****排序后*****");
           foreach (var item in list)
           {
               Console.WriteLine(item.Name);
           }

//Console.WriteLine("***按照Score排序***");

Console.ReadKey();
       }
   }
}

 结果:

C#对集合进行排序

在按照Score进行排序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CustomerSort
{
   class Program
   {
       static void Main(string[] args)
       {
           //List<int> list = new List<int>();
           //list.Add(1);
           //list.Add(5);
           //list.Add(2);
           //list.Add(6);
           //list.Add(3);
           //list.Add(4);
           //Console.WriteLine("*****排序前*****");
           //foreach (var item in list)
           //{
           //    Console.WriteLine(item.ToString());
           //}

//list.Sort();
           //Console.WriteLine("*****排序后*****");
           //foreach (var item in list)
           //{
           //    Console.WriteLine(item.ToString());
           //}

List<Student> list = new List<Student>()
           {
               new Student()
               {
                   Name="Tom",
                   Score=98
               } ,
               new Student()
               {
                   Name="Kevin",
                   Score=69
               } ,
               new Student()
               {
                   Name="Leo",
                   Score=81
               }
           };
           //Console.WriteLine("*****排序前*****");
           //foreach (var item in list)
           //{
           //    Console.WriteLine(item.Name);
           //}
           //list.Sort(new StudentComparer(CompareType.Name));
           //Console.WriteLine("*****排序后*****");
           //foreach (var item in list)
           //{
           //    Console.WriteLine(item.Name);
           //}

Console.WriteLine("*****排序前*****");
           foreach (var item in list)
           {
               Console.WriteLine(item.Score);
           }
           list.Sort(new StudentComparer(CompareType.Name));
           Console.WriteLine("*****排序后*****");
           foreach (var item in list)
           {
               Console.WriteLine(item.Score);
           }

Console.ReadKey();
       }
   }
}

结果:

C#对集合进行排序

来源:https://www.cnblogs.com/dotnet261010/p/9278851.html

标签:C#,集合,排序
0
投稿

猜你喜欢

  • Android消息机制Handler的工作过程详解

    2023-07-31 13:49:03
  • Android init.rc文件详解及简单实例

    2023-08-02 08:55:09
  • java 动态生成bean的案例

    2023-08-09 02:20:05
  • SpringBoot 如何从配置文件读取值到对象中

    2023-10-13 15:43:15
  • Android之使用Bundle进行IPC详解

    2023-09-27 22:44:56
  • Eclipse添加xml文件提示及Hibernate配置学习

    2023-08-17 05:01:47
  • Java 精炼解读数据结构的链表的概念与实现

    2022-03-02 05:17:11
  • Kotlin伴随对象的初始化方法示例讲解

    2022-07-24 05:53:06
  • Java7和Java8中的ConcurrentHashMap原理解析

    2022-06-09 22:06:28
  • Java设计模式编程之解释器模式的简单讲解

    2022-01-24 16:03:32
  • My eclipse 端口占用(9360)问题解决办法

    2023-05-19 02:34:32
  • c#接口使用示例分享

    2022-02-22 17:38:46
  • WebView的介绍与简单实现Android和H5互调的方法

    2023-04-30 19:26:00
  • Spring Batch入门教程篇

    2022-02-15 01:53:01
  • android studio3.0以上如何通过navicat访问SQLite数据库文件

    2022-03-26 14:28:55
  • 基于swing实现窗体拖拽和拉伸

    2023-11-12 22:32:40
  • Android编程使用LinearLayout和PullRefreshView实现上下翻页功能的方法

    2023-06-30 02:16:15
  • JAVA实现扫描线算法(超详细)

    2023-06-30 13:33:20
  • 基于java的opencv开发过程详解

    2022-03-31 20:02:59
  • Java用户登录验证代码

    2022-05-11 16:45:46
  • asp之家 软件编程 m.aspxhome.com