我正在尝试了解泛型,我正在尝试创建自己的通用列表类。
问题是我不知道如何绕过默认值(T);
public IEnumerator<T> GetEnumerator()
{
T current = data[forIndex];
while (!current.Equals(default(T)))
{
yield return current;
forIndex++;
current = data[forIndex];
}
forIndex = 0;
}
这种结构意味着如果它包含值0,它将停止遍历我的列表,因为默认值(T)为0.任何人都可以告诉我如何解决这个问题吗?
答案 0 :(得分:1)
假设您将数据保存在数组中,只需迭代它并产生每次迭代:
for(int i=0; i < data.Length; ++i)
{
yield return data[i];
}
答案 1 :(得分:0)
我认为你的错误在于你依赖的事实是内部数组最后只有默认值,而不是有效数据范围。对于任何元素类型,此假设可能为false(对于int为0,对于ref类型为null。例如,您可以在List<string>
中存储空值。)
所以你不能使用这种技术。
相反,我建议您将当前的项目数保留在整数字段中。这样你就可以正确实现你的迭代器了。像这样:
for(int i=0; i < this.count; ++i) //iterating over this.count elements
yield return data[i];
(某些代码来自另一个答案)。
现在,如果你坚持按自己的方式去做,你可以这样做:
while (current != null)
即使当前类型为T且T不受约束,这仍然有效。如果T是值类型,则条件始终为true(因为值类型将首先装箱,任何装箱值为!= null)。