鼎鼎知识库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

25.接口、列表.md 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. >集合接口和类型
  2. - 大多数接口都可在System.Collections和System.Collections.Generic名称空间中找到。泛型集合类位于System.Collections.Generic名称空间中;
  3. **接口及说明**
  4. - IEnumerable<T>:如果将foreach语句用于集合,就需要IEnumerable接口,这个接口定义了方法GetEnumerator(),它返回一个实现了IEnumerator接口的枚举。
  5. - ICollection<T>:ICollection<T>接口由泛型集合实现。使用这个接口可以获得集合中的元素个数,把集合复制到数组中(CopyTo()方法),还可以从集合中添加和删除元素(Add()、Remove()、Clear())
  6. - IList<T>:用于可通过位置访问其中的元素列表,这个接口定义了一个索引器,可以在集合的指定位置插入或删除某些项(Insert()和RemoveAt()方法).IList<T>接口派生自ICollection<T>接口
  7. - ISet<T>:该接口由集实现。集允许合并不同的集,获得两个集的交集,检查两个集是否重叠。ISet<T>接口派生自ICollection<T>接口
  8. - IDictionary<TKey,TValue>:由包含键和值得泛型集合类实现。使用这个接口可以访问所有的键和值,使用键类型的索引器可以访问某些项,还可以添加或删除某些项
  9. - ILookup<TKey,TValue>:类似于IDictionary<TKey,TValue>接口,实现该接口的集合有键和值,且可以通过一个键包含多个值
  10. - IComparer<T>:由比较器实现,通过Comparer()方法给集合中的元素排序
  11. - IEqualityComparer<T>:由一个比较器实现,该比较器可用于字典中的键,使用这个接口,可以对对象进行相等性比较
  12. > 列表
  13. - 例子:将Racer类中的成员用作要添加到集合中的元素,以表示一级方程式的一位赛车手。这个类有5个属性:Id、Firstname、Lastname、Country和Wins的次数。在该类的构造函数中,可以传递赛车手的姓名和获胜次数,以设置成员。重写ToString()是为了返回赛车手的姓名。Racer类也实现了泛型接口IComparable<T>,为Racer类中的元素排序,还实现了IFormattable接口
  14. ```
  15. public class Racer:IComparable<Racer>,IFormattable
  16. {
  17. public int Id{get;}
  18. public string FirstName{get;set;}
  19. public string LastName{get;set;}
  20. public string Country{get;set;}
  21. public int Wins{get;set;}
  22. public Racer(int id,string firstName,string lastName,string country):this(id,firstName,lastName,country,wens:0)
  23. {}
  24. public Racer(int id,string firstName,string lastName,string country,int wins)
  25. {
  26. Id=id;
  27. FirstName=firstName;
  28. LastName=lastName;
  29. Country=country;
  30. Wins=wins;
  31. }
  32. public override string ToString()=>$"{FirstName}{LastName}";
  33. public string ToString(string format,IFormatProvider formatProvider)
  34. {
  35. if(format==null)format="N";
  36. switch {format.ToUpper()}
  37. {
  38. case "N":
  39. return ToString();
  40. case "F":
  41. return FirstName;
  42. case "L"
  43. return LastName;
  44. case "W"
  45. return $"{ToString()},Wins:{Wins}";
  46. case "C":
  47. return $"{ToString()},Country:{Country}",
  48. case "A"
  49. return $"{ToString()},Country:{Country} Wins:{Wins}";
  50. default:
  51. throw new FormatException(String.Format(formatProvider,$"Format(format)is not supported"));
  52. }
  53. }
  54. public string ToString(string format)=>ToString(format,null);
  55. public int CompareTo(Racer other)
  56. {
  57. int compare=LastName?.CompareTo(other?.LastName)??-1;
  58. if(compare==0)
  59. {
  60. return FirstName?.CompareTo(other?.FirstName)??-1;
  61. }
  62. return compare;
  63. }
  64. }
  65. ```
  66. > 创建列表
  67. - 集合初始值设定项
  68. ```
  69. var intList=new List<int>(){1,2};
  70. var stringList=new List<string>(){"one","two"};
  71. ```
  72. - 添加元素
  73. - 使用Add()方法可以给列表添加元素
  74. ```
  75. var intList=new List<int>();
  76. intList.Add(1);
  77. intList.Add(2);
  78. var stringList=new List<string>();
  79. stringList.Add("one");
  80. stringList.Add("two");
  81. ```
  82. - 插入元素
  83. ```
  84. racers.Insert(3,new Racer(6,"Phil","Hill","USA",3));
  85. 方法InsertRange()提供了插入大量元素的功能,类似于前面的AddRanger()方法。
  86. ```
  87. - 访问元素
  88. - 实现了IList和IList<T>接口的所有类都提供了一个索引器,所以可以使用索引器,通过传递元素号来访问元素。
  89. - 可以使用Count属性确定元素个数,再使用for循环遍历集合中的每个元素,并使用索引器访问每一项:
  90. ```
  91. for (int i=0;i<racers.Count;i++>)
  92. {
  93. WriteLine(racers[i]);
  94. }
  95. ```
  96. - 因为List<T>集合类实现了IEnumerable接口,所以也可以使用foreach语句遍历集合中的元素
  97. ```
  98. foreach(var r in racers)
  99. {
  100. WriteLine(r);
  101. }
  102. ```
  103. - 删除元素
  104. - 搜索