[Test]
public void TestToString()
{
IntegerList list = new IntegerList();
list.Add(5);
list.Add(10);
string t = list.ToString();
Assertion.AssertEquals("5, 10", t.ToString());
}
失败了,没关系。以下代码可以使其通过:
public override string ToString()
{
string[] items = new string[elements.Length];
for (int index = 0; index < elements.Length; index++)
{
items[index] = elements[index].ToString();
}
return String.Join(", ", items);
}
public IEnumerator GetEnumerator()
{
return null;
}
运行测试时,此代码生成异常。为了正确地实现此功能,我将使用一个嵌套类作为枚举器。
class IntegerListEnumerator: IEnumerator
{
IntegerList list;
int index = -1;
public IntegerListEnumerator(IntegerList list)
{
this.list = list;
}
public bool MoveNext()
{
index++;
if (index == list.Count)
return(false);
else
return(true);
}
public object Current
{
get
{
return(list[index]);
}
}
public void Reset()
{
index = -1;
}
}
此类将一个指针传递给 IntegerList 对象,然后只返回此对象中的元素。
这样,便可以对列表执行 foreach 操作,但遗憾的是 Current 属性属于对象类型,这意味着每个值将被装箱才能将其返回。此问题可采用一种基于模式的方法加以解决,此方法酷似当前方法,但它通过 GetEnumerator() 返回一个真正的类(而非 IEnumerator),且此类中的 Current 属性为 int 类型。