>集合接口和类型 - 大多数接口都可在System.Collections和System.Collections.Generic名称空间中找到。泛型集合类位于System.Collections.Generic名称空间中; **接口及说明** - IEnumerable:如果将foreach语句用于集合,就需要IEnumerable接口,这个接口定义了方法GetEnumerator(),它返回一个实现了IEnumerator接口的枚举。 - ICollection:ICollection接口由泛型集合实现。使用这个接口可以获得集合中的元素个数,把集合复制到数组中(CopyTo()方法),还可以从集合中添加和删除元素(Add()、Remove()、Clear()) - IList:用于可通过位置访问其中的元素列表,这个接口定义了一个索引器,可以在集合的指定位置插入或删除某些项(Insert()和RemoveAt()方法).IList接口派生自ICollection接口 - ISet:该接口由集实现。集允许合并不同的集,获得两个集的交集,检查两个集是否重叠。ISet接口派生自ICollection接口 - IDictionary:由包含键和值得泛型集合类实现。使用这个接口可以访问所有的键和值,使用键类型的索引器可以访问某些项,还可以添加或删除某些项 - ILookup:类似于IDictionary接口,实现该接口的集合有键和值,且可以通过一个键包含多个值 - IComparer:由比较器实现,通过Comparer()方法给集合中的元素排序 - IEqualityComparer:由一个比较器实现,该比较器可用于字典中的键,使用这个接口,可以对对象进行相等性比较 > 列表 - 例子:将Racer类中的成员用作要添加到集合中的元素,以表示一级方程式的一位赛车手。这个类有5个属性:Id、Firstname、Lastname、Country和Wins的次数。在该类的构造函数中,可以传递赛车手的姓名和获胜次数,以设置成员。重写ToString()是为了返回赛车手的姓名。Racer类也实现了泛型接口IComparable,为Racer类中的元素排序,还实现了IFormattable接口 ``` public class Racer:IComparable,IFormattable { public int Id{get;} public string FirstName{get;set;} public string LastName{get;set;} public string Country{get;set;} public int Wins{get;set;} public Racer(int id,string firstName,string lastName,string country):this(id,firstName,lastName,country,wens:0) {} public Racer(int id,string firstName,string lastName,string country,int wins) { Id=id; FirstName=firstName; LastName=lastName; Country=country; Wins=wins; } public override string ToString()=>$"{FirstName}{LastName}"; public string ToString(string format,IFormatProvider formatProvider) { if(format==null)format="N"; switch {format.ToUpper()} { case "N": return ToString(); case "F": return FirstName; case "L" return LastName; case "W" return $"{ToString()},Wins:{Wins}"; case "C": return $"{ToString()},Country:{Country}", case "A" return $"{ToString()},Country:{Country} Wins:{Wins}"; default: throw new FormatException(String.Format(formatProvider,$"Format(format)is not supported")); } } public string ToString(string format)=>ToString(format,null); public int CompareTo(Racer other) { int compare=LastName?.CompareTo(other?.LastName)??-1; if(compare==0) { return FirstName?.CompareTo(other?.FirstName)??-1; } return compare; } } ``` > 创建列表 - 集合初始值设定项 ``` var intList=new List(){1,2}; var stringList=new List(){"one","two"}; ``` - 添加元素 - 使用Add()方法可以给列表添加元素 ``` var intList=new List(); intList.Add(1); intList.Add(2); var stringList=new List(); stringList.Add("one"); stringList.Add("two"); ``` - 插入元素 ``` racers.Insert(3,new Racer(6,"Phil","Hill","USA",3)); 方法InsertRange()提供了插入大量元素的功能,类似于前面的AddRanger()方法。 ``` - 访问元素 - 实现了IList和IList接口的所有类都提供了一个索引器,所以可以使用索引器,通过传递元素号来访问元素。 - 可以使用Count属性确定元素个数,再使用for循环遍历集合中的每个元素,并使用索引器访问每一项: ``` for (int i=0;i) { WriteLine(racers[i]); } ``` - 因为List集合类实现了IEnumerable接口,所以也可以使用foreach语句遍历集合中的元素 ``` foreach(var r in racers) { WriteLine(r); } ``` - 删除元素 - 搜索