带有 foreach 循环的 C# IEnumerator,最佳设计模式?

C# IEnumerator with foreach loops, best design pattern?

我知道以前有人问过类似的问题,但我在尝试找到我可以使用的最佳设计模式时走到了死胡同。

我正在尝试创建一个 class-library,其中包含一个工厂 class,它通过方法调用为不同的项目提供枚举器。 注意:这些项目不存在于集合中,只能在知道前一个的情况下创建。 (例如 x(i) = x(i-1) + θ)因此我无法将这些项目实现为 IEnumerable(s)

到目前为止我的想法:

public static class AllItems {
    public sealed class ItemsEnumerator: IEnumerator<Item>{
       //those classes have non-public constructors
       .....
    }
    public static ItemsEnumerator GetItemsEnumerator() {
       return new ItemsEnumerator();
   }

    public sealed class OtherItemsEnumerator:IEnumerator<OtherItem>{
        ....
    }
    public static ItemsEnumerator GetOtherItemsEnumerator() {
       return new ItemsOtherEnumerator();
   }
}

我可以这样做:

foreach(var item in AllItems.GetItemsEnumerator()){
   //do something with item
}

这是行不通的,因为根据 c# 规范,ItemsEnumerator 没有 GetEnumerator 函数(要在 foreach 语句中使用)

如果我改成这样

public static class AllItems {
    public sealed class ItemsEnumerator: IEnumerator{
       .....
       public IEnumerator<Item> GetEnumerator() {
         return this;
       }
    }

    public static ItemsEnumerator GetItemsEnumerator() {
       return new ItemsEnumerator();
    } 
}

总的来说这是一个好的设计,还是我遗漏了什么?

编辑:澄清 c# 规范限制

I am trying to make a class-library with a factory class that provides enumerators for different items via method calls. Note: Those items don't exist in a collection and can only be created knowing the previous one. (e.g. x(i) = x(i-1) + θ) Because of that I cannot implement those items as IEnumerable(s)

您不需要达到那种程度的详细程度 - 您只需使用 yield 即可实现 "conceptual" 集合,而无需连接所有枚举管道:

public IEnumerable<Item> GetItems()
{
   int i = 0;
   while(i < 100) // or foreach(Item item in _baseItems), etc.
   {
       Item item = new Item();
       item.X = i;
       i += 10;
       yield return item;
   }
}

请注意,这 只是为了说明 以显示一种返回动态生成的 "collection" 项的方法。您可以根据自己的情况自由选择合适的方式。