c#中list排序
c#中list排序
c#中list排序一、初始数据
假设我们有一个Student对象,简单起见这个对象只有三个属性,分别是学好、姓名、年龄。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GenericCompare
{
class Student
{
public Student()
{
}
public Student(string no, string name, int age)
{
this.No = no;
this.Name = name;
this.Age = age;
}
public string No
{
get;
set;
}
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
}
}
插入如下数据
List<Student> students = new List<Student>();
students.Add(new Student("001","kenshincui",25));
students.Add(new Student("002", "miaoer", 23));
students.Add(new Student("003", "shenjinjuan", 22));
students.Add(new Student("004", "nieyanxin", 24));
二、调用默认的sort()会报错
报错信息
报错原因
从图中的提示我们可以看出错误原因是由于进行比较的对象并未有任何一个实现IComparable接口,因此也就无法完成排序。事实上对于无参Sort()方法是使用Comparer.Default比较器来排序的,而此比较器进行比较时首先就会检查T是否实现了IComparable泛型接口,如果实现了则使用该实现。否则将坚持是否实现了IComparable接口。如果均未实现则引发InvalidOperationException异常。也就是说如果想使用此方法需要实现ICompara泛型接口或者IComparable接口
三、list常用排序方法
1、List.Sort (泛型 Comparison) 法
此方法的参数是Comparison类型,其实是一个包含两个参数的委托,因此使用此方法,我们只需要定义一个委托,其两个参数均为Student类型,在委托实现的方法比较两个Student对象的Age属性即可。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GenericCompare
{
class Program
{
static void Main(string[] args)
{
List<Student> students = new List<Student>();
students.Add(new Student("001","kenshincui",25));
students.Add(new Student("002", "miaoer", 23));
students.Add(new Student("003", "shenjinjuan", 22));
students.Add(new Student("004", "nieyanxin", 24));
Console.WriteLine("未进行排序之前:");
foreach (Student st in students)
{
Console.WriteLine(st.No+","+st.Name+","+st.Age+";");
}
Console.WriteLine("List.Sort (泛型 Comparison) 排序之后:");
students.Sort(delegate(Student a, Student b) { return a.Age.CompareTo(b.Age); });
foreach (Student st in students)
{
Console.WriteLine(st.No + "," + st.Name + "," + st.Age + ";");
}
Console.ReadKey();
}
}
}
运行结果
2、List.Sort (泛型 IComparer)
此方法需要一个泛型IComparer接口类型,因此只要定义一个类实现此接口然后再调用此方法即可。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GenericCompare
{
class StudentCompare :IComparer<Student>
{
public int Compare(Student a, Student b)
{
return a.Age.CompareTo(b.Age);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GenericCompare
{
class Program
{
static void Main(string[] args)
{
List<Student> students = new List<Student>();
students.Add(new Student("001","kenshincui",25));
students.Add(new Student("002", "miaoer", 23));
students.Add(new Student("003", "shenjinjuan", 22));
students.Add(new Student("004", "nieyanxin", 24));
Console.WriteLine("未进行排序之前:");
foreach (Student st in students)
{
Console.WriteLine(st.No+","+st.Name+","+st.Age+";");
}
Console.WriteLine("List.Sort (泛型 IComparer) 排序之后:");
students.Sort(new StudentCompare());
foreach (Student st in students)
{
Console.WriteLine(st.No + "," + st.Name + "," + st.Age + ";");
}
Console.ReadKey();
}
}
}
四、设定排序范围
虽然上面的方法都实现了泛型集合排序,但是有时我们并不需要对整个集合进行排序而是指对其中一定范围内容的对象进行排序,那么我们就需要使用Sort方法的第四种重载:
List.Sort (Int32, Int32, 泛型 IComparer)
前两个参数分别代表排序的其实位置和排序长度,最后一个参数仍然是泛型IComparer接口类型。上面我们已经定义了StudentComparer类,实现了IComparer接口,这里就可以直接使用了,下面我们只对前三个学生按照年龄由小到大进行排序。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GenericCompare
{
class Program
{
static void Main(string[] args)
{
List<Student> students = new List<Student>();
students.Add(new Student("001","kenshincui",25));
students.Add(new Student("002", "miaoer", 23));
students.Add(new Student("003", "shenj
您可能感兴趣
- python排序方法简单(快速排序的四种python实现推荐)
- python 字典按key值排序(Python 按字典dict的键排序,并取出相应的键值放于list中的实例)
- dedecms简短标题(dedecms文章列表实现序列号排序效果实现代码)
- php大量数据计算有什么技巧(PHP各种常见经典算法总结排序、查找、翻转等)
- sqlserver降序排列(SQL SERVER临时表排序问题的解决方法)
- dedecms文章权重排序(Dedecms实现tags云标签随机颜色与字体大小方法详解)
- mysql 自定义排序
- python中怎样使用列表的sort方法(详解python中sort排序使用)
- python 迭代对象必须实现哪些方法(详解python之heapq模块及排序操作)
- C#插入排序
- dedecms自定义字段(详解怎么样让DEDECMS的list标签支持weight排序的方法)
- dedecms标签怎么调用(DedeCMS织梦后台模板列表如何按字母排序方法代码)
- python队列快速排序(python按照多个条件排序的方法)
- sqlserver修改排序规则几种方法(SQL Server 分页编号的另一种方式推荐)
- 排序算法口诀php(PHP快速排序算法实现的原理及代码详解)
- js数组的sort排序
- 吉林舒兰 封城 15人确诊 276人隔离,出现跨省传播(吉林舒兰封城)
- 四月新番CP人气榜公布,《剃须》两度上榜,沙优不是女朋友(四月新番CP人气榜公布)
- 2019年外媒秋季新番动画角色CP排行榜,桐人和爱丽丝落榜(2019年外媒秋季新番动画角色CP排行榜)
- 新一小兰领衔 盘点动漫中的那些 远距离恋爱情侣(盘点动漫中的那些)
- 大事件 合肥四中火了(大事件合肥四中火了)
- 翼龙贷组织出借人调研 感受鄱阳 借 来的致富路(翼龙贷组织出借人调研)
热门推荐
- lua接口调用崩溃(LuManager新开网站403故障的解决方法)
- 小鸟云怎么登录服务器(小鸟云服务器登陆图文教程)
- selenium是否登录成功(使用selenium模拟登录解决滑块验证问题的实现)
- 云服务器有什么工作用(云服务器有什么用?怎么选择?)
- 如何提升网站在移动端的打开速度
- vs连接sql语句(vs code连接sql server数据库步骤及遇到的问题小结)
- vue调用组件内部的方法(Vue如何实现组件间通信)
- sql统计天数怎么算(SQL对数据进行按月统计或对数据进行按星期统计的实例代码)
- 腾讯云如何添加安全通信端口(腾讯云服务器如何添加安全通信端口?)
- icon图标怎么引入vue(vue引入iconfont图标库的优雅实战记录)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9