数组的大小是固定不变的,而类System.Collections.ArrayList可用于表示大小可变的项列表。
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);
}
}
public class Cow : Animal
{
public void Milk()
{
Console.WriteLine("{0} has been milked.", name);
}
public Cow(string newName)
: base(newName)
{
}
}
public class Chicken : Animal
{
public Chicken(string newName)
: base(newName)
{
}
public void LayEgg()
{
Console.WriteLine("{0} has laid an egg.", name);
}
}
使用集合类的例子是:
using System.Collections;
ArrayList animalList = new ArrayList();
Cow myCow = new Cow("Hayley");
animalList.Add(myCow);
animalList.Add(new Chicken("Roy"));
foreach (Animal temp in animalList)
Console.WriteLine("{0} object," + "name = {1}", temp.ToString(), temp.Name);
ArrayList集合还可使用Remove()和RemoveAt()等方法。
也可通过下标访问,但ArrayList集合是System.Object对象的集合,必须进行数据类型转换,如((Chicken)animalist[1]).LayEgg();而简单数组是强类型化的,不必如此。
创建强类型化的集合:
public class Animals : CollectionBase
{
public Animals()
{
}
public void Add(Animal newAnimal)
{
List.Add(newAnimal);
}
public void Remove(Animal oldAnimal)
{
List.Remove(oldAnimal);
}
//索引符
public Animal this[int index]
{
get
{
return (Animal) List[index];
}
set
{
List[index] = value;
}
}
}
对Animals可正常使用foreach循环。
CollectionBase提供受保护的属性List和InnerList,List可通过IList接口访问项,InnerList用于存储项的ArrayList对象。
键控集合:
允许项通过键值(如字符串名)进行索引。
public class Animals : DictionaryBase
{
public Animals()
{
}
public void Add(string id, AnimalnewAnimal)
{
Dictionary.Add(id, newAnimal);
}
public void Remove(string id)
{
Dictionary.Remove(id);
}
public Animal this[string id]
{
get
{
return (Animal) Dictionary[id];
}
set
{
Dictionary[id] = value;
}
}
}
其foreach需使用DictionaryEntry结构,要得到Animal对象本身必须使用这个结构的Value成员,也可使用结构的Key成员得到相关的键:
foreach (DictionaryEntry myEntry in animalDictionary)
{
Console.WriteLine("{0} object,"+ "name = {1}", myEntry.Value.ToString(), ((Animal) myEntry.Value).Name);
}
迭代器:
使用迭代器,可以按顺序提供要在foreach循环中使用的所有值。使用关键字yield。
1.如果要迭代一个类,可使用方法GetEnumerator(),其返回类型是IEnumerator。
2.如果要迭代一个类成员,例如一个方法,则使用IEnumerable。
简单示例:
public static IEnumerable SimpleList()
{
yield return “string 1”;
yield return “string 2”;
yield return “string 3”;
}
static void Main(string[] args)
{
foreach(string item in SimpleList())
Console.WriteLine(item);
}在键控集合中添加简单迭代器:
public class Animals : DictionaryBase
{
……
public new IEnumerator GetEnumerator()
{
foreach(object animal in Dictionary.Values)
yield return (Animal)animal;
}
}
foreach循环就可与平常用法类似:
foreach(Animal myAnimal in animalDictionary)
{
Console.WriteLine("{0} object,"+ "name = {1}", myAnimal.ToString(), myAnimal.Name);
}
浅度复制:
通过GetCopy()和MemberwiseClone()方法进行浅度复制,在类中添加如下代码:
public object GetCopy()
{
return MemberwiseClone();
}
深度赋值:
实现ICloneable接口的Clone()方法,如:
public class Content
{
public int Val;
}
public class MyClass : ICloneable
{
public Content MyContent = new Content();
public MyClass(int newVal)
{
MyContent.Val = newVal;
}
public object Clone()
{
MyClass clonedMyClass = newMyClass(MyContent.Val);
return clonedMyClass;
}
}
若MyContent字段也需要深度复制,则
public object Clone()
{
MyClass clonedMyClass = newMyClass();
clonedMyClass. MyContent = MyContent.Clone();
return clonedMyClass;
}