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# 泛型集合的自定义类型排序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • c#实现最简洁的快速排序(你绝对可以看懂)

    前言 算法对于程序员的重要性不言而喻,今天我和大家分享算法中的一个基础算法,快速排序.作为一名程序员,相信大家都不陌生,但是要大家徒手一次性写出来,我估计还是有难度的.那么废话不多少,我先简单减少一下概念. 快速排序算法说明: 原始数组L1,从中任意选择一个基准数F(一般选择第1个),小于F的数据放在F的左边记为数组minList,大于F的数据放在F的右边记为数组maxList.那么 L1=minList+F+maxList 然后对minList和maxList再做这样的操作,直到minList

  • c#实现选择排序的示例

    1.工作原理(算法思路) 给定一个待排序数组,找到数组中最小的那个元素 如果最小元素不是待排序数组的第一个元素,则将其和第一个元素互换 在剩下的元素中,重复1.2过程,直到排序完成. 2.动图演示 3.C#代码实现 根据原理设计算法: class Program { //选择排序法 private static void chooseSort(int[] array) { //第一个for循环:每一次循环完成后得到的当前的最大元素都与第i位做交换 for (int i = 0; i < arra

  • C# 中的List.Sort()--集合排序方法全面解析

    在C#中,List.Sort() 不仅为我们提供了默认的排序方法,还为我们提供了4种自定义排序的方法,通过默认排序方法,我们无需重写任何Sort()方法的实现代码,就能对单参数类型的List数据进行单一规则的排序,如果通过对这些方法进行改进我们可以轻松做到对多参数.多规则的复杂排序. 下面是C#自定义排序的4种方法: List<T>.Sort(); List<T>.Sort(IComparer<T> Comparer); List<T>.Sort(int i

  • C#排序算法之归并排序

    本文实例为大家分享了C#实现归并排序具体代码,供大家参考,具体内容如下 代码: //归并排序(目标数组,子表的起始位置,子表的终止位置) private static void MergeSortFunction(int[] array, int first, int last) { try { if (first < last) //子表的长度大于1,则进入下面的递归处理 { int mid = (first + last) / 2; //子表划分的位置 MergeSortFunction(a

  • C#排序算法之快速排序解析

    本文实例为大家分享了C#实现快速排序的具体代码,供大家参考,具体内容如下 代码: /// <summary> /// 排序 /// </summary> /// <param name="array">要排序的数组</param> /// <param name="low">下标开始位置,向右查找</param> /// <param name="high">下标

  • C#实现排序的代码详解

    C#排序案例代码: using System; namespace 排序案例 { class Program { static void Main(string[] args) { //定义随机数列 int a, b, c, d; Random rand = new Random(); int[] intArray = new int[10]; for (int i = 0; i < intArray.Length; i++) { a = rand.Next(1, 100); intArray[

  • 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.WriteLin

  • golang对自定义类型进行排序的解决方法

    前言 Go 语言支持我们自定义类型,我们大家在实际项目中,常常需要根据一个结构体类型的某个字段进行排序.之前遇到这个问题不知道如何解决,后来在网上搜索了相关问题,找到了一些好的解决方案,此处参考下,做个总结吧. 由于 golang 的 sort 包本身就提供了相应的功能, 我们就没必要重复的造个轮子了,来看看如何利用 sort 包来实现吧. sort包浅谈 golang中也实现了排序算法的包sort包,sort 包 在内部实现了四种基本的排序算法:插入排序(insertionSort).归并排序

  • C#泛型集合类型实现添加和遍历

    在"C#中List<T>是怎么存放元素的"中,分析了List<T>的源码,了解了List<T>是如何存放元素的.这次,就自定义一个泛型集合类型,可实现添加元素,并支持遍历 该泛型集合类型一定需要一个添加元素的方法,在添加元素的时候需要考虑:当添加的元素超过当前数组的容量,就让数组扩容:为了支持循环遍历,该泛型集合类型必须提供一个迭代器(实现IEnumerator接口). public class MyList<T> { T[] items

  • C#中把任意类型的泛型集合转换成SQLXML数据格式的实例

    话不多说,跟着小编一起来看下吧 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlTypes; using System.Data; using System.Reflection; using System.IO; using System.Xml; namespace CollectionToXml { class Program

  • C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串的方法

    在工作中,如果需要跟XML打交道,难免会遇到需要把一个类型集合转换成XML格式的情况.之前的方法比较笨拙,需要给不同的类型,各自写一个转换的函数.但是后来接触反射后,就知道可以利用反射去读取一个类型的所有成员,也就意味着可以替不同的类型,创建更通用的方法.这个例子是这样做的:利用反射,读取一个类型的所有属性,然后再把属性转换成XML元素的属性或者子元素.下面注释比较完整,就话不多说了,有需要看代码吧! using System; using System.Collections.Generic;

  • C#中各种泛型集合的使用方法总结

    本篇体验除Queue<T>和Stack<T>之外的其它泛型集合. SortedList<TKey, TValue> SortedList<TKey, TValue>和List<T>比较相似,不同的地方在于SortedList集合元素是排过序的,往SortedList集合添加元素的时候需要添加键值对数据.在添加集合元素的时候,首先采用"二分查找算法"找到合适的位置,然后元素被放到该位置,该位置后面所有的集合元素整体后退一位. s

  • 深入理解golang的基本类型排序与slice排序

    前言 其实golang的排序思路和C和C++有些差别. C默认是对数组进行排序, C++是对一个序列进行排序, Go则更宽泛一些,待排序的可以是任何对象, 虽然很多情况下是一个slice(分片, 类似于数组),或是包含 slice 的一个对象. 排序(接口)的三个要素: 1.待排序元素个数 n : 2.第 i 和第 j 个元素的比较函数 cmp : 3.第 i 和 第 j 个元素的交换 swap : 乍一看条件 3 是多余的, c 和 c++ 都不提供 swap . c 的 qsort 的用法:

  • 编写高质量代码改善C#程序——使用泛型集合代替非泛型集合(建议20)

    软件开发过程中,不可避免会用到集合,C#中的集合表现为数组和若干集合类.不管是数组还是集合类,它们都有各自的优缺点.如何使用好集合是我们在开发过程中必须掌握的技巧.不要小看这些技巧,一旦在开发中使用了错误的集合或针对集合的方法,应用程序将会背离你的预想而运行. 建议20:使用泛型集合代替非泛型集合 在建议1中我们知道,如果要让代码高效运行,应该尽量避免装箱和拆箱,以及尽量减少转型.很遗憾,在微软提供给我们的第一代集合类型中没有做到这一点,下面我们看ArrayList这个类的使用情况: Array

  • C#泛型集合Dictionary<K,V>的使用方法

    1.要使用Dictionary集合,需要导入C#泛型命名空间 System.Collections.Generic(程序集:mscorlib) 2.描述 1).从一组键(Key)到一组值(Value)的映射,每一个添加项都是由一个值及其相关连的键组成 2).任何键都必须是唯一的 3).键不能为空引用null(VB中的Nothing),若值为引用类型,则可以为空值 4).Key和Value可以是任何类型(string,int,custom class 等) 3.创建及初始化 复制代码 代码如下:

  • C#读取数据库返回泛型集合详解(DataSetToList)

    复制代码 代码如下: protected void Page_Load(object sender, EventArgs e)        {            if (!IsPostBack)            {                IList<LYZX.Model.LYZX_NewsTypeModel> list = GetList<LYZX.Model.LYZX_NewsTypeModel>(System.Configuration.Configurat

随机推荐