一、集合
** System.Collections名称空间中的几个接口提供了基本的集合功能
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) { } } }
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、运行结果
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
注意Add和Remove是强类型化的方法,该方法只能用于处理Animal类或者派生于Animal的类,而前面介绍的ArrayList实现代码可以处理任何的对象。
2、索引符
这种类似数组的用法必须是在提供了索引符之后才能够使用。
(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()的方法。