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#基础]泛型集合的自定义类型排序
引用 最近总有种感觉,自己复习的进度总被项目中的问题给耽搁了,项目中遇到的问题,不总结又不行,只能将复习基础方面的东西放后再放后.一直没研究过太深奥的东西,过去一年一直在基础上打转,写代码,反编译,不 ...
- Axis2Service客户端访问通用类集合List自定义类型
Axis2 服务四种客户端调用方式: 1.AXIOMClient 2.generating a client using ADB 3.generating a client using XMLBean ...
- 泛型学习第三天——C#读取数据库返回泛型集合 把DataSet类型转换为List<T>泛型集合
定义一个类: public class UserInfo { public System.Guid ID { get; set; } public string LoginName ...
- java:集合的自定义多重排序
问题: 有一个乱序的对象集合,要求先按对象的属性A排序(排序规则由业务确定,非A-Z或0-9的常规顺序),相同A属性的记录,按根据属性B排序(排序规则,同样由业务确定,非常规顺序) -前提:业务规则是 ...
- MapReduce实战(二)自定义类型排序
需求: 基于上一道题,我想将结果按照总流量的大小由大到小输出. 思考: 默认mapreduce是对key字符串按照字母进行排序的,而我们想任意排序,只需要把key设成一个类,再对该类写一个compar ...
- Java,集合按自定义规则排序
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...
- java利用自定义类型对树形数据类型进行排序
前言 为什么集合在存自定义类型时需要重写equals和hashCode? 1.先说List集合 List集合在存数据时是可以重复的但是 当我们需要判断一个对象是否在集合中存在时这样就有问题了! 因为我 ...
- golang 自定义类型的排序sort
sort包中提供了很多排序算法,对自定义类型进行排序时,只需要实现sort的Interface即可,包括: func Len() int {... } func Swap(i, j int) {... ...
- HashSet存储自定义类型元素和LinkedHashSet集合
HashSet集合存储自定义类型元素 HashSet存储自定义类型元素 set集合报错元素唯一: ~存储的元素(String,Integer,-Student,Person-)必须重写hashCode ...
随机推荐
- 【Excel技巧】用IF函数进行等级评定
如果下面给出一份"2月份语文成绩考核表",那么如何对成绩进行等级评定呢. 等级评定规则: 总分(100分) A级(91-100) B级(81-90) C级(71-80) D级(70 ...
- Centos 6.9 安装 php5.6
1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们, 如: yum remove php.x86_64 php-cli.x86_6 ...
- 许嵩新歌《放肆》发布 && 递归 + Stream+Lambda相遇成树
一.<放肆>如约而至 今早5:00在迷迷糊糊中醒来,打开手机一看,许嵩又发新歌了,名字叫做<放肆>,澎湃的旋律,依旧古典高雅的用词,这个大男孩,已经不像12年那时候发些伤感非主 ...
- 洛谷 P4819 [中山市选]杀人游戏(tarjan缩点)
P4819 [中山市选]杀人游戏 思路分析 题意最开始理解错了(我太菜了) 把题意简化一下,就是找到可以确定杀手身份的最小的危险查看数 (就是不知道该村名的身份,查看他的身份具有危险的查看数量),用 ...
- centos8平台redis cluster集群添加/删除node节点(redis5.0.7)
一,当前redis cluster的node情况: 我们的添加删除等操作都是以这个cluster作为demo cluster采用六台redis,3主3从 redis1 : ip: 172.17.0.2 ...
- js 如何获取浏览器的高度?
<SCRIPT LANGUAGE="JavaScript"><!--var s = ""; s += " 网页可见区域宽:" ...
- 边界层吞吸技术(BLI)
气流在机体表面前进时,由于受到摩擦,其速度会不断降低,从而会产生湍流甚至气流分离,而流动分离又会造成大量紊流.涡,使升力大量损失,同时也会造成阻力急剧增加.边界层吞吸技术就是一种对附面层气流" ...
- Anderson《空气动力学基础》5th读书笔记 第1记——流动相似性
在飞机真正上天之前,我们常常需要制作出缩小版的模型放在风洞中吹呀吹,尽可能地模拟真实飞行中的参数,这时我们就需要实现流动相似性,这便是本记要讲的. 文章目录 一.流动相似性的标准 二.流动相似性的应用 ...
- 学会这三个命令,你就不再是git只会用三板斧的菜鸟了
前言 在之前的文章当中我们介绍了最基本的git add.git commit和git push的用法以及基本原理,还介绍了gitignore文件的设置方法,从而让我们可以使用git add .来添加我 ...
- js 日期格式、内容合法、比较大小、表单提交验证
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"/> 5 &l ...