List泛型集合对象排序
本文的重点主要是解决:List<T>对象集合的排序功能。
一、List<T>.Sort 方法 ()
MSDN对这个无参Sort()方法的介绍:使用默认比较器对整个List<T>中的元素进行排序。
从官方文档的介绍,很难的看出详细的解析,而且还要完整的知识结构去分析,上面提到了一个关键词:比较器。大致看了下,比较器是一个委托。在这里不去透析它的完整脉络,本文只去讲解怎么去解决两个实际的问题:
- List集合元素升序排列
- List集合元素降序排列
1.1.对于数字类型的调用
调用结果:为升序,无法满足降序。
示例:
1.2.对于字符串类型的调用
调用结果:把值解析成拼音字母,按照首个英文字母顺序升序排列,如果首字母相同,比较第二个的首字母。
示例:
1.3.对于自定义对象的调用
调用结果:无法完成方法的执行,运行报错。
示例:
总结:很显然这个无参的Sort()方法很难满足我们实际开发中需求,对于面向对象编程我们,常常就是对集合中的对象进行排序。
二、自定义对象类型默认排序
对象本身不是一个具体的值,在排序逻辑上显然要选择对象的一个属性进行排序。
1.1手动设置无参Sotr()方法的默认排序逻辑
将List的指定类型的类实现IComparable泛型接口,示例:
class Student:IComparable<Student>
{ public string Id { get; set; }
public string Name { get; set; }
public int Age { get; set; } public int CompareTo(Student other)
{
//return other.Age.CompareTo(this.Age); // 年龄降序
return this.Age.CompareTo(other.Age); // 年龄升序
}
}
排序逻辑:this在前面就意味着指定按照这个属性升序,如果写在后面就是降序。
调用:
List<Student> list_obj = new List<Student> {
new Student { Age=,Name="tom"},
new Student { Age=,Name="jack"},
new Student {Age=, Name="bob"},
}; list_obj.Sort(); for (int i = ; i < list_obj.Count; i++)
{
string output_result = string.Format("{0},年龄:{1}",list_obj[i].Name,list_obj[i].Age);
Console.WriteLine(output_result);
}
在调用Sort()方法的时候,就自动调用了我们实现接口的CompareTo方法的逻辑代码。
结果如图:
总结:此方法的实现,虽然解决了可以按照对象属性进行升序和降序,但是在实现CompareTo的方法里,指定的属性是固定的。这样的话显然
不灵活,那么下面就介绍另一种方法,解决该问题。
二、自定义对象类型动态排序
默认排序,通过实现IComparable泛型接口来完成。并且在实现ComparaTo接口里指定排序的属性是固定的,写死的。如果功能上有多条件排序(按照年龄、学号等等),默认排序就无法满足。
1.1为每一个要排序的属性写一个对应的排序类,一个排序逻辑对应一个排序类,示例:
//按照Id升序
class StudentOrderBy_Id_asc:IComparer<Student>
{
public int Compare(Student x, Student y)
{
return x.Id.CompareTo(y.Id);
}
} //按照年龄降序
class StudentOrderBy_Age_desc:IComparer<Student>
{
public int Compare(Student x, Student y)
{
return y.Age.CompareTo(x.Age);
}
}
1.2.调用
List<Student> list_obj = new List<Student> {
new Student { Id=,Age=,Name="tom"},
new Student { Id=,Age=,Name="jack"},
new Student {Id=,Age=, Name="bob"},
new Student {Id=,Age=, Name="ben"},
}; //---按照ID升序----
list_obj.Sort(new StudentOrderBy_Id_asc());
Console.WriteLine("---按照ID升序----");
for (int i = ; i < list_obj.Count; i++)
{
string output_result = string.Format("{0},学号:{1}",list_obj[i].Name,list_obj[i].Id);
Console.WriteLine(output_result);
}
//---END按照ID升序---- //---按照年龄降序----
list_obj.Sort(new StudentOrderBy_Age_desc());
Console.WriteLine("---按照年龄降序----");
for (int i = ; i < list_obj.Count; i++)
{
string output_result = string.Format("{0},年龄:{1}", list_obj[i].Name, list_obj[i].Age);
Console.WriteLine(output_result);
}
//---END按照年龄降序----
1.3.输出结果:
1.4编写逻辑:
- 确定好要排序的属性和排序规则,为此写一个排序类。
- 编写Compare方法的排序逻辑(指定排序属性,排序逻辑)。
- 创建排序类的对象,作为参数参入,调用Sort()方法。
总结:本文主要是解决实际问题,要深入到细节原理,会涉及到一些知识点:冒泡排序、多态、比较器、委托。
在具备知识点的前提结合Msdn文档可以尝试透析原理。
List泛型集合对象排序的更多相关文章
- wpf 导出Excel Wpf Button 样式 wpf简单进度条 List泛型集合对象排序 C#集合
wpf 导出Excel 1 private void Button_Click_1(object sender, RoutedEventArgs e) 2 { 3 4 ExportDataGrid ...
- json字符串转泛型集合对象
Dictionary<string, object> jd = js.Deserialize<Dictionary<string, object>>(item); ...
- [c#基础]泛型集合的自定义类型排序
引用 最近总有种感觉,自己复习的进度总被项目中的问题给耽搁了,项目中遇到的问题,不总结又不行,只能将复习基础方面的东西放后再放后.一直没研究过太深奥的东西,过去一年一直在基础上打转,写代码,反编译,不 ...
- C#中DataTable与泛型集合互转(支持泛型集合中对象包含枚举)
最近在做WCF,因为是内部接口,很多地方直接用的弱类型返回(DataSet),这其实是一种非常不好的方式,最近将项目做了修改,将所有接口返回值都修改成强类型,这样可以减少很多与客户端开发人员的沟通,结 ...
- ArrayList/List 泛型集合
List泛型集合 集合是OOP中的一个重要概念,C#中对集合的全面支持更是该语言的精华之一. 为什么要用泛型集合? 在C# 2.0之前,主要可以通过两种方式实现集合: a.使用ArrayList 直接 ...
- List泛型集合常用方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace List ...
- C#基础精华03(常用类库StringBuilder,List<T>泛型集合,Dictionary<K , V> 键值对集合,装箱拆箱)
常用类库StringBuilder StringBuilder高效的字符串操作 当大量进行字符串操作的时候,比如,很多次的字符串的拼接操作. String 对象是不可变的. 每次使用 System. ...
- 02.List泛型集合
List泛型可以转换成数组 List泛型和数组的相同点: List泛型的数据类型必须是指定的,数组的数据类型也必须是指定的. List泛型和数组的不同点: List泛型的长度是随意的,而数组的长度必须 ...
- C# 泛型集合的自定义类型排序
一.泛型集合List<T>排序 经sort方法之后,采用了升序的方式进行排列的. List<int> list = new List<int>() { 2, 4, ...
随机推荐
- 利用X.509证书对XML进行加密和签名
综述 XML加密和签名技术应用非常广泛. ASP.NET 使用XML加密对配置信息进行加密:InfoPath使用XML签名对表单进行签名:Web服务使用XML加密和签名对SOAP消息进行加 ...
- SqlServer把日期转换成不同格式的字符串的函数大全
SQL语句 结果SELECT CONVERT(varchar(100), GETDATE(), 0)-- 05 03 20 ...
- PAT L3-008 喊山(广搜)
喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤.呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的.原来它是彝族先民用 ...
- win10下安装oracle11G Examples出错[INS-32025][INS-52001]
安装oracle examples时提示出错:[INS-32025] 所选安装与指定 Oracle 主目录中已安装的软件冲突.[INS-52001] Oracle Database Examples ...
- PHP下ajax跨域的解决方案之window.name
原理核心:window对象的name属性是一个很特别的属性,当该window的location变化,然后重新加载,它的name属性可以依然保持不变. 依此原理,我们可以在页面A中用iframe加载其他 ...
- webstorm 2017 激活破解
2017-06-15更新 之前都是使用2017.2.27的方法,版本是2017.1.1,还没提示过期,但是根据评论说这个链接已经失效了,评论也给出了个新地址:http://idea.iteblog.c ...
- MEME(Motif-based sequence analysis tools)使用说明
MEME(Motif-based sequence analysis tools)使用说明 2011-05-27 ~ ADMIN MEME是用于从一堆序列中搜索功能结构域的工具.比如说当你拿到了许多C ...
- html5移动开发。
禁止滚动 $('#idl').bind("touchmove",function(e){ e.preventDefault(); }); 图片居中 (因为图片比较特别,所以需要在外 ...
- maven 编译的时候总是报一些奇怪的错误 比如 surefire-boot 2.10 .jar 可是私服里查看本来就没有这个高的版本。
或者私服总是 报 read time out , 或者 io 错误, 或者 gzip 解压错误,或者总是尝试下载一些高版本的jar , 而这些jar 可能是不存在的 .. 尝试 重新下载 apac ...
- jQuery 插件使用记录
Validate 表单验证 ver 1.6 浏览更多 默认情况下,当表单 submit 时,那些验证不通过的 field 旁边会出现错误消息提示,有时很方便,但有时看起来很不美观.可以关闭此消息提示. ...