List排序
List集合对数字或者字母排序可能并不难,不够要是对象排序,就要考虑用对象的哪个字段进行排序。list提供了一个Sort()方法,List已经可以对内置类型(比如:int、double、string)排序,通过对接口的实现也可以定制自己的类排序。可以通过
IComparable<T>
接口或者IComparer<T>
接口实现。
-
通过
IComparer<T>
接口实现扑克牌先按排面数字从小到大排序,如果数字相同则按花色枚举值排序需要自己构建一个单独的类来帮助List对他的成员排序。创建一个类实现
IComparer<T>
接口的Compare()方法。它取两个对象参数x,y,并返回一个int类型的值。如果要比较的值x小于y可以返回一个负值,反之返回一个正值,相等返回零。当然你也可以改变返回值来实现升序和降序排列。ListCompare.cs
class ListCompare { //随机函数 static Random random = new Random(); //初始化列表 public List<card> cards = new List<card>() { new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, }; //打印列表 public void OutputCards(List<card> cards) { Console.WriteLine("一共{0}张扑克牌,下面为输出结果",cards.Count); foreach (card c in cards) { Console.WriteLine(c.Cardkind + "\t" + c.CardNumber); } } } //枚举类型 enum Kind { 黑桃, 方块, 红桃, 梅花 };//声明扑克四种枚举类型,枚举类型的从小到大顺序 //扑克牌对象 class card { public int CardNumber;//数字 public Kind Cardkind;//花色 } //自定义排序类 class CardCompare : IComparer<card> { //实现的是降序排列,你也可以改变返回值实现升序排列 public int Compare(card x, card y) { if (x.CardNumber > y.CardNumber) { return 1; }else if(x.CardNumber < y.CardNumber) { return -1; } else//如果数字相同,则比较枚举值,枚举类型都对应一个数值默认从0开始。 { if (x.Cardkind > y.Cardkind) { return 1; }else if(x.Cardkind < y.Cardkind) { return -1; } else { return 0;//排面花色都相等 } } } }
StartClass.cs
class StarClass { public static void Main(string[] args) { ListCompare lc = new ListCompare(); CardCompare cc = new CardCompare(); //必须要创建比较对象类的实例 Console.WriteLine("排序前==========="); lc.OutputCards(lc.cards);//打印列表 lc.cards.Sort(cc);//比较对象类的实例传入Sort中 Console.WriteLine("排序后==========="); lc.OutputCards(lc.cards);//打印列表 Console.ReadKey(); } }
输出结果
-
通过
IComparable<T>
接口实现扑克牌先按排面数字从小到大排序,如果数字相同则按花色枚举值排序修改card类,让card类实现
IComparable<T>
接口,IComparable<T>
接口里面只有一个CompareTo()方法取一个对象作为参数,如果要要比较的对象,在有序列表中应当出现在这个对象(自己)的后面,CompareTo()就返回一个正数。
ListCompare.cs
class ListCompare { //随机函数 static Random random = new Random(); //初始化列表 public List<card> cards = new List<card>() { new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, new card{CardNumber=random.Next(0,14),Cardkind=(Kind)random.Next(0,4)}, }; //打印列表 public void OutputCards(List<card> cards) { Console.WriteLine("一共{0}张扑克牌,下面为输出结果",cards.Count); foreach (card c in cards) { Console.WriteLine(c.Cardkind + "\t" + c.CardNumber); } } } //枚举类型 enum Kind { 黑桃, 方块, 红桃, 梅花 };//声明扑克四种枚举类型,枚举类型的从小到大顺序 //扑克牌对象 class card:IComparable<card> { public int CardNumber;//数字 public Kind Cardkind;//花色 public int CompareTo(card other) { if (this.CardNumber > other.CardNumber) { return 1; } else if (this.CardNumber < other.CardNumber) { return -1; } else//如果数字相同,则比较枚举值,枚举类型都对应一个数值默认从0开始。 { if (this.Cardkind > other.Cardkind) { return 1; } else if (this.Cardkind < other.Cardkind) { return -1; } else { return 0;//排面花色都相等 } } } }
StartClass.cs
class StarClass { public static void Main(string[] args) { ListCompare lc = new ListCompare(); Console.WriteLine("排序前==========="); lc.OutputCards(lc.cards);//打印列表 lc.cards.Sort();//不需要参数 Console.WriteLine("排序后==========="); lc.OutputCards(lc.cards);//打印列表 Console.ReadKey(); } }
输出结果
根据结果截图可以看出来这两种方法都实现了,扑克牌按数字从小到大排序,如果数字相等则按花色从黑桃, 方块, 红桃到 梅花的排序。
最后总结:
List<T>
自定义排序可以通过IComparable<T>
接口或者IComparer<T>
接口实现。
- 用
IComparable<T>
接口实现时需要对象实现接口中的CompareTo()方法。最后调用List.Sort()排序;- 用
IComparer<T>
接口需要创建比较类,并实现接口中的Compare()方法。最后需要创建比较类的实例,并当作参数传入List.Sort()方法中。
-------------------------------------------------------------------2020.04.07 晚 天气多云转晴
来源:https://www.cnblogs.com/botinghub/p/12655888.html