一、泛型集合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# 泛型集合的自定义类型排序的更多相关文章

  1. [c#基础]泛型集合的自定义类型排序

    引用 最近总有种感觉,自己复习的进度总被项目中的问题给耽搁了,项目中遇到的问题,不总结又不行,只能将复习基础方面的东西放后再放后.一直没研究过太深奥的东西,过去一年一直在基础上打转,写代码,反编译,不 ...

  2. Axis2Service客户端访问通用类集合List自定义类型

    Axis2 服务四种客户端调用方式: 1.AXIOMClient 2.generating a client using ADB 3.generating a client using XMLBean ...

  3. 泛型学习第三天——C#读取数据库返回泛型集合 把DataSet类型转换为List<T>泛型集合

    定义一个类: public class UserInfo    {        public System.Guid ID { get; set; } public string LoginName ...

  4. java:集合的自定义多重排序

    问题: 有一个乱序的对象集合,要求先按对象的属性A排序(排序规则由业务确定,非A-Z或0-9的常规顺序),相同A属性的记录,按根据属性B排序(排序规则,同样由业务确定,非常规顺序) -前提:业务规则是 ...

  5. MapReduce实战(二)自定义类型排序

    需求: 基于上一道题,我想将结果按照总流量的大小由大到小输出. 思考: 默认mapreduce是对key字符串按照字母进行排序的,而我们想任意排序,只需要把key设成一个类,再对该类写一个compar ...

  6. Java,集合按自定义规则排序

    import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...

  7. java利用自定义类型对树形数据类型进行排序

    前言 为什么集合在存自定义类型时需要重写equals和hashCode? 1.先说List集合 List集合在存数据时是可以重复的但是 当我们需要判断一个对象是否在集合中存在时这样就有问题了! 因为我 ...

  8. golang 自定义类型的排序sort

    sort包中提供了很多排序算法,对自定义类型进行排序时,只需要实现sort的Interface即可,包括: func Len() int {... } func Swap(i, j int) {... ...

  9. HashSet存储自定义类型元素和LinkedHashSet集合

    HashSet集合存储自定义类型元素 HashSet存储自定义类型元素 set集合报错元素唯一: ~存储的元素(String,Integer,-Student,Person-)必须重写hashCode ...

随机推荐

  1. Java泛型的协变与逆变

    泛型擦除 Java的泛型本质上不是真正的泛型,而是利用了类型擦除(type erasure),比如下面的代码就会出现错误: 报的错误是:both methods  have same erasure ...

  2. CentOS7 执行 service iptables save 报错 The service command supports only basic LSB actions xxxxxx

    现象描述 在 CentOS 7.6.1810 下执行 service iptables save 命令,出现如下错误: [root@test ~]# service iptables save The ...

  3. shell-脚本的建立和执行

    1. shell脚本的建立和执行  1) shell脚本的建立 在linux系统中,shell脚本(bash shell程序)通常是在编辑器(如vi/vim)中编写,由unix/linux命令.bas ...

  4. postgresql 和 mysql 数据库备份恢复以及时区问题

    概要 postgesql 12 备份/恢复脚本 时区设置 mysql 5.6 备份/恢复脚本 时区设置 概要 postgresql 和 mysql 是最常用的 2 种开源关系数据库, 很多项目也会优先 ...

  5. 高效的后端API开发模板-illuminant

    概要 整体介绍 补充说明 Q. 有了 prisma 自动生成的 graphql 接口, 为什么还要 rest 接口和 websocket 接口? Q. 为什么要通过 illuminant 加一层反向代 ...

  6. 正式班D9

    2020.10.16星期五 正式班D9 一.vmware workstation的使用 虚拟机管理软件 定义 虚拟机(Virtual Machine)软件是一套特殊的软件,它可以作为操作系统独立运行, ...

  7. 性能测试-CPU瓶颈分析的思路

    CPU(中央处理器),是电子计算机的主要设备之一,电脑中的核心配件.CPU作为计算机系统的运算和控制核心,是信息处理.程序运行的最终执行单元.CPU的功效主要为处理指令.执行操作.控制时间.处理数据. ...

  8. 【全网免费VIP观看】哔哩哔哩番剧解锁大会员-集合了优酷-爱奇艺-腾讯-芒果-乐视-ab站等全网vip视频免费破解去广告-高清普清电视观看-持续更新

    哔哩哔哩番剧解锁大会员-集合了优酷-爱奇艺-腾讯-芒果-乐视-ab站等全网vip视频免费破解去广告-高清普清电视观看-持续更新 前言 突然想看电视,结果 没有VIP 又不想花钱,这免费的不久来啦. 示 ...

  9. 带权二分图最大匹配KM算法

    二分图的判定 如果一个图是连通的,可以用如下的染色法判定是否二分图: 我们把X部的结点颜色设为0,Y部的颜色设为1. 从某个未染色的结点u开始,做BFS或者DFS .把u染为0,枚举u的儿子v.如果v ...

  10. linux(centos8):用cut显示文本内容的指定列

    一,cut命令的用途 从一个文本文件或者文本流中提取文本列 分别用: 字节.字符.字段 作为单位进行提取 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.co ...