标签:装箱 空间 哈希表 inf main list() 种类 删除 linq
1为什么要用集合
数组的局限性:数组元素个数固定,数组一旦定位就无法改变元素总数,如果有需求变化,则必须修改源码; 如果初始化元素总数非常大,则会造成空间浪费。
集合的特点:根据需要动态增加个数,没有限制。
2泛型集合List
表示泛型,T是Type的简写,表示当前不确定具体类型。
可以根据用户的实际需要,确定当前集合需要存放的数据类型,一旦确定不可改变。
使用泛型集合只能添加一种类型的数据,数据取出后无需强制转换。
使用前引入命名空间:System.Collections.Generic
常用方法:添加元素Add(),删除元素Remove(索引) 元素个数:Count 使用可以用遍历foreach
泛型集合的最大特性:严格约束集合内的元素类型
3泛型集合Dictionary
Dictionary通常称为字典,约束集合中元素类型。
编译时检查类型约束,无需拆装箱操作,与哈希表操作类似。
4List默认排序
list.Sort(); 基本数据类型可以直接排序,对于字符串默认按照拼音首字母升序排列
调用集合中的Reverse()方法,实现元素反转。
如果T不是基本数据类型而又想对其排序,T这个类必须继承IComparable这个接口,并且必须对提供泛型接口要实现的方法,这个方法一般直接显示接口,但当此类继承自多个接口时需要显式实现接口。此实现接口方法的签名和返回值类型以及方法名不可更改。
1 public int CompareTo(Student other)
2 {
3 //return other.stuName.CompareTo(this.stuName); //other在前,降序
4
5 return this.StuId.CompareTo(other.StuId); //this在前,升序
6 }
IComparable接口
默认的排序方式,只能有一种。
5List动态排序
如果仅对姓名进行升序或学号进行降序等可只用List默认排序。List只有一种排序方式。
但在实际项目中,可能有时是姓名升序、有时是姓名降序、有时是学号升序、有时是学号降序,需要用到ICompare接口。使用比较器ICompare实现动态排序。
默认排序可完全被比较器IComPare所替代。
1 //年龄升序排列
2 class AgeASC : IComparer 3 {
4 public int Compare(Student x, Student y)
5 {
6 return x.Age - y.Age;
7 }
8 }
9 //年龄降序排列
10 class AgeDESC : IComparer11 {
12 public int Compare(Student x, Student y)
13 {
14 //return y.Age - x.Age;
15 return y.Age.CompareTo(x.Age);
16 }
17 }
18 //姓名升序排列
19 class NameASC : IComparer20 {
21 public int Compare(Student x, Student y)
22 {
23 return x.StuName.CompareTo(y.StuName); //x在前,升序
24 }
25 }
26 //姓名降序排列
27 class NameDESC : IComparer28 {
29 public int Compare(Student x, Student y)
30 {
31 return y.StuName.CompareTo(x.StuName); //y在前,降序
32 }
33 }
IComparer比较器接口
6总结Sort()方法
6.1List集合的Sort方法共有4种。
Sort():使用默认比较器IComparable排序对象。
Sort(ICompare compare):将实现比较器接口的对象作为参数,这个对象是指继承了此比较器接口的类的对象。
6.2集合排序总结
如果是基本数据类型元素,可以直接排序。
如果是对象类型元素:
1.当排序只有一种的时候,可以使用默认比较器IComparable在类中直接实现接口即可。
2.当需要多种排序的时候,需要添加对应排序类,并给每一个排序类实现比较器接口ICompare来完成不同排序方法。
7使用Linq排序
1 static void Main(string[] args)
2 {
3 //实例化List集合对象
4 List list = new List();
5 //添加对象元素
6 Student objStu1 = new Student() { Age = 20, StuId = 1001, StuName = "小张" };
7 Student objStu2 = new Student() { Age = 25, StuId = 1003, StuName = "小李" };
8 Student objStu3 = new Student() { Age = 22, StuId = 1002, StuName = "小王" };
9 list.Add(objStu1);
10 list.Add(objStu2);
11 list.Add(objStu3);
12 //默认排序
13 Console.WriteLine("------------默认排序------------");
14 for (int i = 0; i )
15 {
16 Console.WriteLine("姓名:{0} 年龄:{1} 学号:{2}", list[i].StuName, list[i].Age, list[i].StuId);
17 }
18 //年龄降序排序
19 Console.WriteLine("------------年龄降序排序------------");
20 List stuList = list.OrderByDescending(s => s.Age).ToList();
21 for (int i = 0; i )
22 {
23 Console.WriteLine("姓名:{0} 年龄:{1} 学号:{2}", stuList[i].StuName, stuList[i].Age, stuList[i].StuId);
24 }
25 //姓名升序排序
26 Console.WriteLine("------------姓名升序排序------------");
27 stuList = list.OrderBy(s => s.StuName).ToList();
28 for (int i = 0; i )
29 {
30 Console.WriteLine("姓名:{0} 年龄:{1} 学号:{2}", stuList[i].StuName, stuList[i].Age, stuList[i].StuId);
31 }
32 Console.ReadLine();
33 }
34 #endregion
使用LINQ排序
C#面向对象三
标签:装箱 空间 哈希表 inf main list() 种类 删除 linq
原文地址:https://www.cnblogs.com/yangmengke2018/p/10805742.html