C#学习记录(23)集合

    集合:可以使用集合来维护对象组。与数组不同,集合可以控制对集合内的对象进行访问、搜索和排序功能。本文主要介绍如何使用和创建集合类。

    C#中的数组实现为System.Array 类的实例,它们只是集合类(Collection Classes)中的一种类型。集合的功能(包括基本功能)可以通过接口来实现,该接口不仅没有限制我们使用基本集合类,例如System.Array,相反,我们还可以创建自己的定制集合类。

    System.Collections 名称空间中的几个接口提供了基本的组合功能:
     IEnumerable 可以迭代集合中的项。
     ICollection(继承于IEnumerable)可以获取集合中项的个数,并能把项复制到一个简单的数组类型中
     IList(继承于IEnumerable 和ICollection)提供了集合的项列表,允许访问这些项并提供其他一些与项列表相关的基本功能

     IDictionary(继承于IEnumerable 和ICollection)类似于IList,但提供了可通过键值(而不是索引)访问的项列表。


    一.使用集合

    ArrayList animalArrayList = new ArrayList();    //创建arraylist集合

    ///以下代码用于初始化集合中的成员

    Cow myCow2 = new Cow("Hayley");
    animalArrayList.Add(myCow2);

    animalArrayList.Add(new Chicken("Roy"));

    ////写出每个animal对象的信息

    foreach (Animal myAnimal in animalArrayList)
    {

        Console.WriteLine("New {0} object added to ArrayList collection, " +

                "Name = {1}", myAnimal.ToString(), myAnimal.Name);

    }

    Console.WriteLine("ArrayList collection contains {0} objects.", animalArrayList.Length);///获取集合长度

    简单数组是强类型化的,可以直接访问它们所包含的项类型。所以您可以直接调用项的方法:

            animalArray[0].Feed();

    数组的类型是抽象类型Animal,因此不能直接调用由派生类提供的方法,而必须使用数据类型转换:

            ((Chicken)animalArray[1]).LayEgg();

    以下为arrayliat特有的:

    ////使用Remove()和RemoveAt()方法删除项

    animalArrayList.RemoveAt(0);

    animalArrayList.Remove(myCow2);

    删除索引为0的项,会使其他项在数组中移动一个位置,所以应使用索引0(而非1)来访问Chicken 对象,不再有索引为1的项了。

    AddRange()方法不是ArrayList 提供的任何接口的一部分,这个方法专用于ArrayList 类。它可以给集合添加一个数组。

    animalArrayList.AddRange(animalArray);///将一个数组添加到集合中


    二.定义集合类

    我们可以从一个类中派生自己的集合,例如System.Collections.CollectionBase 类,这个抽象类提供了集合类的许多实现

方式。这是推荐使用的方式。

    CollectionBase 类有接口IEnumerable、ICollection 和IList,但只提供了一些简要的实现代码,特别是IList 的Clear()和RemoveAt()方法,以及ICollection 的Count 属性。如果要使用提供的功能,就需要自己执行其他代码。

        public class Animals : CollectionBase///强类型集合:从CollectionBase类中派生出集合类Animals
       {
                public void Add(Animal newAnimal)    ///添加Animal类成员的方法
                {
                     List.Add(newAnimal);    //调用List的添加方法
                }

               public void Remove(Animal newAnimal)    ///移除Animal类成员的方法
               {
                     List.Remove(newAnimal);
               }

              public Animals()
              {
              }

              public Animal this[int animalIndex]    ////这个animalIndex是集合的索引符,等价于数组的下标
              {
                 get    ///读访问器
                 {
                        return (Animal)List[animalIndex];
                 }
                 set    ///写访问器
                 {
                        List[animalIndex] = value;
                 }
              }

   }

    三.索引符

    索引符(indexer)是一种特殊类型的属性,可以把它添加到一个类中,以提供类似于数组的访问。实际上,可以通过索引符提供更复杂的访问,因为我们可以用方括号语法定义和使用复杂的参数类型。它最常见的一个用法是对项执行简单的数字索引。

    上面集合类中定义了Animal索引符。

    static void Main( )
    {
        Animals animalCollection = new Animals();    //实例化了Animals 对象
        animalCollection.Add(new Cow("Jack"));        //给对象添加元素

        animalCollection.Add(new Chicken("Vera"));    //Animal是抽象类,只能用派生类才能进行实例化

        animalCollection[0].Feed();    ///利用索引符直接调用第一个集合元素的方法

        foreach (Animal myAnimal in animalCollection)    ///循环访问
        {
            myAnimal.Feed();
        }
        Console.ReadKey();
    }

猜你喜欢

转载自blog.csdn.net/shenseyoulan/article/details/80881262