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实现推荐)
- sql语句groupby分组后怎么显示(SQL group by去重复且按照其他字段排序的操作)
- dede头部文件在哪(dede专题节点文章按id,点击等类型排序)
- javascript 数组排序
- linq 排序
- c#中list排序
- laravel时间日期字段比较(Laravel find in set排序实例)
- dedecms标签怎么调用(DedeCMS织梦后台模板列表如何按字母排序方法代码)
- php中数组使用技巧(php常用经典函数集锦数组、字符串、栈、队列、排序等)
- mysql 自定义排序
- dedecms文章权重排序(修改dedecms文章标题长度限制的方法)
- python数据分析删除重复值(Python3实现从排序数组中删除重复项算法分析)
- js数组的sort排序
- sql语句按字段排序(SQL语句实现表中字段的组合累加排序)
- C#冒泡排序
- mysql 排序源码(MySQL排序原理和案例详析)
- 袁冰妍轧戏 拍《琉璃》的同时还在拍《将夜》,难怪被骂演技差(拍琉璃的同时还在拍将夜)
- 刚红就耍大牌,《琉璃》角色滤镜碎一地,心疼工作人员(琉璃角色滤镜碎一地)
- 袁冰妍郑业成这对可以处,有脸红情话他们是真的敢说(袁冰妍郑业成这对可以处)
- 《祝卿好》台词又土又甜,就喜欢这么直接的恋爱(祝卿好台词又土又甜)
- 大女主 汤唯垂青电视圈,搭档朱亚文出演《大明皇妃孙若微传》(汤唯垂青电视圈)
- 红色代表什么(红色代表什么情感和含义)
热门推荐
- sqlserver常用基本数据类型有哪些(浅述SQL Server的语句类别 数据库范式 系统数据库组成)
- 免备案云服务器快吗?使用海外云服务器好不好(免备案云服务器快吗?使用海外云服务器好不好)
- sqlserver存储删除过程(Sql中存储过程的定义、修改和删除操作)
- sql server 2016配置管理(SQL Server 2016 配置 SA 登录教程)
- python的条件判断和循环(对Python中的条件判断、循环以及循环的终止方法详解)
- python操作mysql连接池(详解Python连接MySQL数据库的多种方式)
- js如何解决iphone异形屏适配(Html5适配iphoneX刘海屏的简单实现)
- dedecms悬浮导航(DEDECMS开启绝对地址PC端跳转到静态手机端实现方法)
- 网站如何提高用户体验
- 去除网页滚动条