第11章 集合、比较和转换
11.1集合
强类型化的:使用时不需要把他们转换为正确的类型
System.Collections
IEnumerable:可以迭代集合中的项
ICollection:可以获取集合中项的个数
IList:提供了集合的列表项
IDictionary:提供了可通过键码值访问的项列表。
11.1.2定义集合
public class Animals:CollectionBase
{
Public void Add(Animal newAnimal)
{
List.Add(newAnimal);
}
}
11.1.3索引符
public class Animals:CollectionBase
{
Public Animal this[]
{
Get
{
Return (Animal)List[animalIndex];
}
Set
{
List[animalIndex]=Value;
}
}
}
11.1.5关键字值集合和IDictionary
public class Animals:DictionaryBase
{
Public void Add(string newID,AnimalnewAnimal)
{
Dictionary.Add(newID,newAnimal);
}
Public void Remove(string newID,Animal newAnimal)
{
Dictionary.Remove(newAnimal);
}
Public Animal this[string animalID]
{
Get
{
Return (Animal)Dictionary[animalID];
}
Set
{
Dictionary[animalID]=value;
}
}
}
Foreach(DictionaryEntry myEntry inanimalCollection)
{
Console.WriteLine(“”,myEntry.Value.ToString(),((Animal)myEntry.Value).Name);
}
11.1.6迭代器(IEnumerable)
Foreach循环
(1) 调用collectionObject.GetEnumerator(),返回一个IEnumerator引用,这个方法可以通过IEnumerable接口的实现代码来获得,但这是可选的。
(2) 调用所返回的IEnumerator接口的MoveNext()方法
(3) 如果MoveNext()方法返回true,就是用IEnumerator接口的Current属性获取对象的一个引用,用于foreach循环。
(4) 重复前面两步,直到MoveNext()方法返回false为止,此时循环停止。
迭代器返回的类型可能是IEnumerable和IEnumerator
(1) 如果要迭代一个类,可使用GetEnumerator(),返回类型是IEnumerator
(2) 如果要迭代一个类成员,例如一个方法,使用IEnumerable。
在迭代器中,使用yield关键字选择要在foreach循环中使用的值
Yield return value; yield break; 退出foreach
11.1.7深度复制
ICloneable
Public object Clone()
11.2比较
11.2.1类型比较
1.封箱和拆箱
封箱(boxing)是把值类型转换为System.Object类型,或者转换为由值类型实现的接口类型。
拆箱(unboxing)是相反的转换过程
ObjectrefType=valType1;
它允许使用集合中的值类型,集合中项的类型是object。其次,允许在值类型上调用object。
2. is运算符
<operand>is <type>
11.2.2值比较
可以使用运算符重载,或者使用IComparable和IComparer接口
1. 运算符重载(operatoroverloading)
Public static AddClass1 operator +(AddClass1 op1,AddClass1op2)
{}
2. IComparable和IComparer接口
IComparable:在要比较的对象的类中实现,可以比较该对象和另一个对象 CompareTo
IComparer在一个单独的类中实现,可以比较任意两个对象 Compare
11.3转换
public static implicit(explicit)operator ConvClass2(ConvClass1 op1)
as