实现集合的简单方法?

rav*_*ven 2 .net c# ienumerable ienumerator yield

我正在开发一个集合类,它应该实现IEnumerator和IEnumerable.

在我的第一个方法中,我直接实现了它们.现在我已经发现了yield关键字,并且我已经能够简化所有内容,将IEnumerator/IEnumerable接口替换为readonly属性,这些值使用yield在循环中返回IEnumerable.

我的问题:是否有可能以这样的方式使用yield,我可以迭代类本身,而不实现IEnumerable/IEnumerator?

即,我想要一个类似于框架集合的功能:

List<int> myList = new List<int>();
foreach (int i in myList)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这有可能吗?

更新:似乎我的问题措辞严厉.我不介意实现IEnumerator或IEnumerable; 我只是认为唯一的方法是使用旧的Current/MoveNext/Reset方法.

Jon*_*eet 9

你不会实施IEnumerable<T>IEnumerable得到foreach工作-但它会是一个好主意,这样做.这很容易做到:

public class Foo : IEnumerable<Bar>
{
    public IEnumerator<Bar> GetEnumerator()
    {
        // Use yield return here, or 
        // just return Values.GetEnumerator()
    }

    // Explicit interface implementation for non-generic
    // interface; delegates to generic implementation.
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

实现的替代方案IEnumerable<T>只会调用您的Values属性,但仍提供GetEnumerator()方法:

public class Foo
{
    public IEnumerator<Bar> GetEnumerator()
    {
        // Use yield return here, or 
        // just return Values.GetEnumerator()
    }
]
Run Code Online (Sandbox Code Playgroud)

虽然这会起作用,但这意味着你将无法将你的集合传递给任何期望的东西IEnumerable<T>,比如LINQ to Objects.

这是一个鲜为人知的事实,它foreach适用于支持GetEnumerator()返回具有适当类型MoveNext()Current成员的类型的方法的任何类型.这实际上是允许在泛型之前使用强类型集合,其中迭代集合不会包含值类型等.现在真的没有调用它,IMO.