zoukankan      html  css  js  c++  java
  • C#学习笔记(九)——集合、比较和转换

    一、集合

    ** System.Collections名称空间中的几个接口提供了基本的集合功能

    image

    Ps:这里看成一个动态的链表,但是已经完美的封装好了。

    (一)使用集合

    1、代码示例

    (1)Animal.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Exercise
    {
        public abstract class Animal
        {
            protected string name;
    
            public string Name
            {
                get
                {
                    return name;
                }
                set
                {
                    name = value;
                }
            }
    
            public Animal()
            {
                name = "The animal with no name";
            }
            public Animal(string newName)
            {
                name = newName;
            }
    
            public void Feed()
            {
                Console.WriteLine("{0} has been fed", name);
            }
        }
    }

    (2)Cow.cs

    namespace Exercise
    {
        public class Cow:Animal 
        {
            public void Milk()
            {
                Console.WriteLine("{0} has been milked.", name);
            }
    
            public Cow(string newName):base(newName)
            {
    
            }
        }
    }

    (3)Chicken.cs

    namespace Exercise
    {
        public class Chicken:Animal
        {
            public void LayEgg()
            {
                Console.WriteLine("{0} has laid an egg.", name);
            }
    
            public Chicken(string newName):base(newName)
            {
    
            }
        }
    }
    (4)Program.cs
    namespace Exercise
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Create an Array type collection of Animal " + "objects and use it:");
    
                Animal[] animalAraay = new Animal[2];
                Cow myCowl = new Cow("Deirdre");
                animalAraay[0] = myCowl;
                animalAraay[1] = new Chicken("Ken");
    
                foreach(Animal myAnimal in animalAraay)
                {
                    Console.WriteLine("New {0} object added to Array collection, " + "Name = {1}", myAnimal.ToString(), myAnimal.Name);
                }
    
                Console.WriteLine("Array collection contains {0} objects.", animalAraay.Length);
                animalAraay[0].Feed();
                ((Chicken)animalAraay[1]).LayEgg();
                Console.WriteLine();
                Console.ReadKey();
    
                Console.WriteLine("Create an ArrayList type collection of Animal " + "object and use it ");
                ArrayList animalArrayList = new ArrayList();
                Cow mycow2 = new Cow("Heylay");
                animalArrayList.Add(mycow2);
                animalArrayList.Add(new Chicken("Roy"));
    
                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.Count);
                ((Animal)animalArrayList[0]).Feed();
                ((Chicken)animalArrayList[1]).LayEgg();
                Console.WriteLine();
    
                Console.WriteLine("Additional manipulation of ArrayList:");
                animalArrayList.RemoveAt(0);
                ((Animal)animalArrayList[0]).Feed();
                animalArrayList.AddRange(animalAraay);
                ((Chicken)animalArrayList[2]).LayEgg();
                Console.WriteLine("The animal called {0} is at index {1}.", myCowl.Name, animalArrayList.IndexOf(myCowl));
                myCowl.Name = "Janice";
                Console.WriteLine("The animal is now called {0}.", ((Animal)animalArrayList[1]).Name);
                Console.ReadKey();
    
            }
        }
    }

    2、运行结果

    image

     

    3、注意点:

    (1)ArrayList创建时不需要指定初始长度值。但是Array是需要的。

    (2)对于ArrayList是不强调类型的一个集合,所以再采用所属对象的方法之类的时候,必须进行强制类型转换,而对于Array来说,他是强调对象类型的集合,所以可以直接调用其方法,但是对于其派生类来说,还是需要进行强制类型转换。

    (3)还有些删除(at)和扩展方法(AddRange)之类的扩展方法

    (4)ArrayList需要加上using System.Collections;名字空间的引用,切记切记。

     

    (二)定义集合

         一般从已有的基类来派生自己的集合,例如System.Collections.CollectionsBase还有System.IDictonaryBase。

    1、System.Collections.CollectionsBase

    (1)为了便于完成任务,CollectionBase提供了两个受保护的属性List和InnerList,List可以通过IList接口访问项,InnerList则是用于储存项的ArrayList对象。

    (2)一个demo

    image

    注意Add和Remove是强类型化的方法,该方法只能用于处理Animal类或者派生于Animal的类,而前面介绍的ArrayList实现代码可以处理任何的对象。

    2、索引符

    (1)image

           这种类似数组的用法必须是在提供了索引符之后才能够使用。

    (2)  一个demo:添加一个数字索引。

    public class Animals:CollectionBase
    {
         
           public Animal this[int animalIndex]
           {
                 get
                 {
                        return (Animal)List[animalIndex];   //因为IList.List属性返回的是一个System.Object对象。所以要进行强制类型转换。
                 }
                 set
                 {
                        List[animalIndex]=value;
                 }
           }
    }

    (3)下面我们使用Animal来构建一个Animals集合

    a、创建一个Animals类

    using System;
    using System.Collections.Generic;
    using System.Collections;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Exercise
    {
        public class Animals:CollectionBase
        {
            public void Add(Animal newAnimal)
            {
                List.Add(newAnimal);
            }
            public void Remove(Animal newAnimal)
            {
                List.Remove(newAnimal);
            }
    
            public Animals()
            {
    
            }
            public Animal this[int animalIndex]
            {
                get
               {
                     return (Animal)List[animalIndex];
               }
                set
                {
                    List[animalIndex] = value;
                }
            }
        }
    }

    b、修改Program.cs的代码

    using System;
    using System.Collections.Generic;
    using System.Collections;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Exercise
    {
        class Program
        {   
            static void Main(string[] args)
            {
                Animals animalCollection = new Animals();
    
                animalCollection.Add(new Cow("Jack"));
                animalCollection.Add(new Chicken("SB")); 
    
                foreach(Animal myAnimal in animalCollection)
                {
                    myAnimal.Feed();
                }
                Console.ReadKey();
    
            }
        }
    }

    c、简单来说就是创建了一个Animal的集合,List是用于访问的接口,所以有Add,Remove的方法,我们还添加了索引符,最后再主函数里面实例化一个Animal集合,然后添加了两个Animal的派生类,最后使用foreach循环调用这两个对象继承于基类Animal的Feed()的方法。

  • 相关阅读:
    如何在CentOS系统中安装字体 51CTO.COM
    C++检查输入数据类型? 知乎
    义乌市爱因宝母婴用品有限公司_公司简介
    硬盘对拷必备 AGE USB/eSATA对拷机现卖场!_青岛行情中关村在线
    Download: Microsoft SQL Server Management Studio Express Microsoft Download Center Download Details
    今晚看啥
    nano接收器
    12306订票助手 (版本 3.5.0)
    Microsoft® SQL Server® 2008 Management Studio Express
    有线键盘和鼠标确实应该退出历史舞台了
  • 原文地址:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4163172.html
Copyright © 2011-2022 走看看