使用foreach循环遍历通用列表

时间:2012-09-08 13:43:12

标签: c# foreach

我正在尝试了解泛型,我正在尝试创建自己的通用列表类。

问题是我不知道如何绕过默认值(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.任何人都可以告诉我如何解决这个问题吗?

2 个答案:

答案 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)。