IEnumerable的多个枚举器

the*_*row 2 .net c# ienumerable ienumerator

我有一个定制的集合,里面有许多对象生成模式.
它可以一次生成所有内容,一个对象或一次生成N个对象.
我想有选择在运行时之间切换生成的实现,甚至可能创建新的.
我正在寻找具有这种语法的东西:

foreach(var obj in myCollection.EnumerateAs(new LazyEnumerator())
{
   // ...
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:
我不知道EnumerateAs()返回什么?我假设它是IEnumerator但它仍然是我的列表的枚举器?
LazyEnumerator是否继承自IEnumerator?
怎么知道myCollection?

Dan*_*ant 5

您的返回值EnumerateAs()应为IEnumerable<T>,其中T是集合中包含的对象类型.我建议您阅读有关yield return的更多信息,因为这可以帮助您了解枚举的工作原理.没有用于提供枚举"策略"的默认类,但您可以通过以各种方式对底层集合使用yield return来轻松实现此类内容.

从您的问题中不清楚枚举策略如何与您的集合类进行交互.看起来你可能会像以下一样:

public interface IEnumerationStrategy<TCollection, T>
{
    IEnumerable<T> Enumerate(TCollection source);
}

public class Quark {}

public class MyCollection
{
    public IEnumerable<Quark> EnumerateAs(IEnumerationStrategy<MyCollection, Quark> strategy)
    {
        return strategy.Enumerate(this);
    }

    //Various special methods needed to implement stategies go here
}

public class SpecialStrategy : IEnumerationStrategy<MyCollection, Quark>
{
    public IEnumerable<Quark> Enumerate(MyCollection source)
    {
        //Use special methods to do custom enumeration via yield return that depends on specifics of MyCollection
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您也可以使用简单的策略替换策略类Func<MyCollection, IEnumerable<T>>,但上述内容最接近您所需的语法.