========================== 泛型集合 =========================================
一,泛型集合
泛型:有泛型集合,泛型方法,泛型类。泛型是一种约束,取数据时候无需拆箱装箱操作
集合:通常数组定义后,长度是固定的,而集合可以动态的添加原始,没有限制
ps:集合的循环一般搭配foreach
(1)List<T>
a. T: 表示当前的数据类型是不确定的,使用泛型集合只能添加一种类型的数据(声明的时候的类型),数据取出后不需要进行强制转换
b. 引用命名空间:System.Collections.Generic;系统默认是引入的
c: 常用方法及属性
添加元素:Add(<T>);
删除元素:RemoveAt(索引)
删除元素: Remove(obj)
插入元素:Insert(索引,obj); --在相应位置插入,其他元素后移
元素个数:Count
集合的应用
//创建几个学员对象 Student objStu1 = new Student(1001, "小王"); Student objStu2 = new Student(1002, "小刘"); Student objStu3 = new Student(1003, "小张"); Student objStu4 = new Student(1004, "小李"); //创建集合对象 List<Student> stulist = new List<Student>(); stulist.Add(objStu1); stulist.Add(objStu2); stulist.Add(objStu3); stulist.Add(objStu4); //获取元素的个数 Console.WriteLine("元素总数:{0}", stulist.Count); //删除一个元素 stulist.Remove(objStu3); stulist.RemoveAt(0); //插入一个对象 stulist.Insert(0, new Student(1005, "王丽")); //遍历集合 foreach(Student item in stulist) { Console.WriteLine(item.StudentName+"\t"+ item.StudentId); } Console.ReadLine(); //使用集合初始化器 List<Student> list = new List<Student>() { objStu1, objStu2, objStu3, objStu4 }; List<string> nameList = new List<string>() { "小王", "校长", "小李" };ps:约束类型的好处是严格约束其内的元素类型,比如给stulist添加个teacher成员,会报错。这样做的好处是取的时候不需要类型转换了。
(2)Dictionary<K,V>
Dictionary<K,V>通常称之为字典,<K,V>约束集合中元素类型。
1.编译时候检查元素类型,无需拆箱装箱操作,与哈希表操作类似。
2.可以使用下标索引的方式访问:stus["小王"].StudentId
//创建几个学员对象 Student objStu1 = new Student(1001, "小王"); Student objStu2 = new Student(1002, "小刘"); Student objStu3 = new Student(1003, "小张"); Student objStu4 = new Student(1004, "小李"); //创建Dictionary泛型集合 Dictionary<string, Student> stus = new Dictionary<string, Student>(); stus.Add("小王", objStu1); stus.Add("小刘", objStu2); stus.Add("小张", objStu3); stus.Add("小李", objStu4); Console.WriteLine(stus["小王"].StudentId); foreach(string key in stus.Keys) { Console.WriteLine(key); } Console.WriteLine("-----------------------------"); foreach(Student item in stus.Values) { Console.WriteLine(item.StudentId + "\t" + item.StudentName); } Console.ReadLine();(3)Hashtable
常用方法:
添加元素:Add
删除元素: Remove(key)
包含:Contains(key),ContainsValue(obj),ContainsKey(key)
元素个数:Count
泛型的非泛型类型: Dictionary 对应 hastable,List〈T〉 对应 ArrayList
==========================集合List 排序 =========================================
值类型排序,默认升序
List<int> listNum = new List<int>() { 13, 353, 45, 6, 56, 57 }; foreach (int item in listNum) { Console.WriteLine(item); } Console.WriteLine("==========排序后=========="); listNum.Sort(); foreach (int item in listNum) { Console.WriteLine(item); }字符类型排序,按照Ascii表排序
List<string> listString = new List<string>() { "ag", "ga", "agagag", "zaag" }; foreach (string item in listString) { Console.WriteLine(item); } Console.WriteLine("==========排序后=========="); listString.Sort(); foreach (string item in listString) { Console.WriteLine(item); }对象的排序,需要在类中实现IComparable<T>接口(接口实现对象的排序按照那个属性进行排序)
1.可以查询报错信息详情知道具体实现那个接口2.不知道实现接口的那个方法,可以将鼠标放上,然后选择
public class Student:IComparable<Student> { private int studentId; private string studentName; private int age; public Student(int studentId ,string studentName) { this.studentId = studentId; this.studentName = studentName; } public Student(int studentId ,string studentName,int age):this(studentId,studentName) { this.age = age; } public int StudentId { get { return studentId; } set { studentId = value; } } public string StudentName { get { return studentName; } set { studentName = value; } } // 接口实现,按照某个属性排序,降序排序 public int CompareTo(Student other) { return other.StudentName.CompareTo(this.StudentName); } } //对象的排序 List<Student> listStus = new List<Student>(); listStus.Add(objStu1); listStus.Add(objStu2); listStus.Add(objStu3); listStus.Add(objStu4); foreach(Student item in listStus) { Console.WriteLine(item.StudentName); } Console.WriteLine("==========排序后=========="); listStus.Sort(); foreach (Student item in listStus) { Console.WriteLine(item.StudentName); } Console.ReadLine();ps:排序规则:后减前,降序,前减后升序
对象的动态排序,多个属性排序
1.默认排序只能按照一种属性进行排序,如果想要多个属性排序,即可以按照姓名排序,或者学号排序(注意不是按照姓名,学号排序) 可以使用排序比较器
2.比较器可以替代默认排序
public class Student { private int studentId; private string studentName; private int age; public Student(int studentId ,string studentName) { this.studentId = studentId; this.studentName = studentName; } public Student(int studentId ,string studentName,int age):this(studentId,studentName) { this.age = age; } public int StudentId { get { return studentId; } set { studentId = value; } } public string StudentName { get { return studentName; } set { studentName = value; } } } //添加4个排序类,分别实现升序降序排序 class StudentNameASC:IComparer<Student> { public int Compare(Student x, Student y) { return x.StudentName.CompareTo(y.StudentName); } } class StudentNameDESC:IComparer<Student> { public int Compare(Student x, Student y) { return y.StudentName.CompareTo(x.StudentName); } } class StudentIdASC : IComparer<Student> { public int Compare(Student x, Student y) { return x.StudentId.CompareTo(y.StudentId); } } class StudentIdDESC:IComparer<Student> { public int Compare(Student x, Student y) { return y.StudentId.CompareTo(x.StudentId); } } Console.WriteLine("==========按照学号降序排序=========="); listStus.Sort(new StudentIdDESC()); foreach (Student item in listStus) { Console.WriteLine(item.StudentName); }总结:
1.如果是基本数据类型元素,可以直接排序
2.如果是对象类型元素
a.当排序只有一种的时候,可以使用默认比较器IComparable<T>在类中直接实现接口排序
b.当需要多种排序的时候,需要添加对应排序类,并给每一个排序类实现比较器接口ICompare<T>来完成不同排序方法。
二,序列化和反序列
https://www.cnblogs.com/maitian-lf/p/3670570.html
序列化是把一个内存中的对象的信息转化成一个可以持久化保存的形式,以便于保存或传输,序列化的主要作用是不同平台之间进行通信,
常用的有序列化有json、xml、文件等,下面就逐个讲下这三种序列化的方法。
(一)、序列化为json
推荐使用 newtonsoft 将对象序列化为json 格式
(二)、序列化为xml
C#中将对象序列化和反序列化为xml的类是XmlSerializer,要引用System.Xml.Serialization先创建一个XmlSerializer对象实例,然后用实例的Serialize的方法将对象写入到文件流中,代码如下:
class Program { static void Main(string[] args) { Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f }; XmlSerializer formatter = new XmlSerializer(typeof(Book)); using (FileStream stream = new FileStream(@"c:\book.xml", FileMode.OpenOrCreate)) { formatter.Serialize(stream, book); } Console.Read(); } }( 三)、序列化为文件
C#中将对象序列化和反序列化为二进制文件的类是BinaryFormatter,要引用System.Runtime.Serialization.Formatters.Binary先创建一个BinaryFormatter对象实例,然后用实例的Serialize的方法将对象写入到文件流中,代码如下: class Program { static void Main(string[] args) { Book book = new Book() { ID = 101, Name = "C#程序设计", Price = 79.5f }; //序列化文件 BinaryFormatter formatter = new BinaryFormatter(); using (FileStream stream = new FileStream(@"c:\book.txt", FileMode.OpenOrCreate)) { formatter.Serialize(stream, book); } Console.Read(); } }ps: 序列化为为文件或者xml ,被序列化的对象要加 [Serializable]
应用场景:
三,XML的操作
转载于:https://www.cnblogs.com/haigui-zx/p/8502681.html