您的位置:首页 > 编程语言 > C#

C#学习笔记(九)——集合、比较和转换

2014-12-14 22:32 141 查看

一、集合

** 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)
{

}
}
}
(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、运行结果





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、索引符

(1)



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

(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()的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: