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
您可能感兴趣
- php实现非递归快速排序(PHP实现无限极分类的两种方式示例递归和引用方式)
- php大量数据计算有什么技巧(PHP各种常见经典算法总结排序、查找、翻转等)
- python利用空列表进行数字排序(python实现计数排序与桶排序实例代码)
- python 迭代对象必须实现哪些方法(详解python之heapq模块及排序操作)
- sqlserver修改排序规则几种方法(SQL Server 分页编号的另一种方式推荐)
- mysql分页查询有几种(MySQL 查询的排序、分页相关)
- dedecms自定义字段(详解怎么样让DEDECMS的list标签支持weight排序的方法)
- python队列快速排序(python按照多个条件排序的方法)
- sql语句按字段排序(SQL语句实现表中字段的组合累加排序)
- python中怎样使用列表的sort方法(详解python中sort排序使用)
- python数据分析删除重复值(Python3实现从排序数组中删除重复项算法分析)
- mysql顺序排序(Mysql 中文排序规则说明)
- C#快速排序
- php脚本通过文件路径批量上传文件(php遍历目录下文件并按修改时间排序操作示例)
- MySQL中对varchar类型的排序
- laravel前后端分离实现排序(laravel自定义分页的实现案例offset和limit)
- 怎么做好SEO(怎么做好seo内容优化)
- 冬季钓鱼子线用 长 还是 短(冬季钓鱼子线用)
- 鱼竿 夏钓短,冬钓长 ,一定是这样 认清优缺点在选竿(鱼竿夏钓短冬钓长)
- 鲢鳙钓底还是钓浮 流水的水域应怎样做钓(鲢鳙钓底还是钓浮)
- 入秋后的第二场苹果发布会来了 全新M1系列芯片登场(入秋后的第二场苹果发布会来了)
- 苹果正式发布自研芯片M1 5nm 32核心 彻底放弃Intel(苹果正式发布自研芯片M1)
热门推荐
- 弹性云主机的组成(什么叫弹性云服务器?弹性云主机的“弹性”反映在哪?)
- docker和tomcat建立连接(如何基于Dockerfile构建tomcat镜像)
- ASP.NET mvc异常处理的方法
- opencv调用摄像头图像识别(Python+OpenCV采集本地摄像头的视频)
- 安装apache服务器配置(Apache 配置详解最好的APACHE配置教程)
- 宝塔linux面板新手使用教程交流(宝塔面板Linux自动磁盘挂载工具 BT-Panel 1.0)
- python分步式进程计算(python中如何使用分步式进程计算详解)
- 怎么判断云服务器的性能(如何判断云服务器的好坏)
- eval解析json字符串
- mysql 排序源码(MySQL排序原理和案例详析)