一、泛型集合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. 同一台电脑同时使用gitHub和gitLab

    工作中我们有时可能会在同一台电脑上使用多个git账号,例如:公司的gitLab账号,个人的gitHub账号.怎样才能在使用gitlab与github时,切换成对应的账号,并且免密?这时我们需要使用ss ...

  2. Python数据类型--元组(tuple)

    元组与列表非常相似,最大区别在于: (1)元组是不可修改的,定义之后就"固定"了. (2)元组在形式上是用()这样的圆括号括起来 (3)元组不能插入或删除元素 注:元素可修改与不可 ...

  3. CV学习日志:CV开发常用库及其头文件

    CV开发过程中,通常会涉及以下库:(1)语言/视觉:C.CPP.QT.OpenCV(2)通信/模拟:ROS2.Gazebo.Webots(3)日志/数学:Eigen3.Gflags.Glog.Cere ...

  4. MeteoInfoLab脚本示例:天气现象符号

    天气现象符号分布图实际就是散点图,可以用scatterm函数绘制,但之前需要创建天气符号图例,用weatherspec函数.如果只需要绘制某些天气现象(比如雾.霾),可以给出相应的天气符号序号列表(可 ...

  5. bootStrap小结3

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...

  6. 习题3-2 分子量(Molar Mass, ACM/ICPC Seoul 2007, UVa1586)

    #include<stdio.h> #include<string.h> #include<ctype.h> double getweight(char x) { ...

  7. JavaScript数字与字母相互转换

    数字 转换为 字母: const num = 'a'.charCodeAt() // num = 97 字母 转换为 数字: var str = String.fromCharCode(97) // ...

  8. flink 处理实时数据的三重保障

    flink 处理实时数据的三重保障 window+watermark 来处理乱序数据对于 TumblingEventTimeWindows window 的元数据startTime,endTime 和 ...

  9. 微信小程序分类的实现

    微信小程序的分类功能思路 实现思路 1.把屏幕当成一个固定的盒子,然后把盒子分成两边,并让盒子的每一边都能够滚动. 2.通过将左侧边栏元素的id和右边内容的categoryId进行匹配,渲染展示相同i ...

  10. Angular双向绑定简单理解

    在使用Antd的时候,一直很好奇里面的双向绑定的自定义组件是怎么做的. 因为之前一直用,没有去细看文档. 今天抽空来简单的撸一下. 在ng中,()是单向数据流,从视图目标到数据源,[()]这样就是双向 ...