鼎鼎知识库
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

25.接口、列表.md 4.7KB

集合接口和类型

  • 大多数接口都可在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<Racer>,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<int>(){1,2}; var stringList=new List<string>(){"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<racers.Count;i++>) { WriteLine(racers[i]); }
    • 因为List集合类实现了IEnumerable接口,所以也可以使用foreach语句遍历集合中的元素 foreach(var r in racers) { WriteLine(r); }
  • 删除元素
  • 搜索