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

C#带foreach循环的IEnumerator,最佳设计模式?,c#,design-patterns,class-library,ienumerator,C#,Design Patterns,Class Library,Ienumerator,我知道以前也有人问过类似的问题,但在试图找到我能使用的最佳设计模式时,我已经走到了死胡同 我试图用一个工厂类创建一个类库,该工厂类通过方法调用为不同的项提供枚举器。 注意:这些项目在集合中不存在,只能在知道前一个项目的情况下创建。(例如,x(i)=x(i-1)+θ),因此我无法将这些项实现为IEnumerable(s) 我之前的想法: public static class AllItems { public sealed class ItemsEnumerator: IEnumerat

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

我试图用一个工厂类创建一个类库,该工厂类通过方法调用为不同的项提供枚举器。 注意:这些项目在集合中不存在,只能在知道前一个项目的情况下创建。(例如,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();
   }
}
这将不起作用,因为根据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();
    } 
}
公共静态类所有项{
公共密封类ItemsEnumerator:IEnumerator{
.....
公共IEnumerator GetEnumerator(){
归还这个;
}
}
公共静态ItemsEnumerator GetItemsEnumerator(){
返回新的ItemsEnumerator();
} 
}
总体而言,这是一个好的设计,还是我遗漏了什么

编辑:关于c#规范限制的澄清

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

您不需要进入该详细级别-只需使用
yield
即可实现“概念”集合,而无需连接所有枚举管道:

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;
   }
}
public IEnumerable GetItems()
{
int i=0;
while(i<100)//或foreach(在_baseItems中的Item)等。
{
项目=新项目();
项目X=一;
i+=10;
收益回报项目;
}
}

请注意,这只是为了演示如何返回动态生成的项目的“集合”。您可以根据自己的情况以任何适当的方式进行调整。

这个问题更适合CodeReview,它更倾向于理论和“全局”思维,而StackOverflow更侧重于非常具体的操作方法和修复。“因此,我无法将这些项作为IEnumerable实现。”我不明白那句话。
IEnumerable
实现可以返回您想要的任何值序列。如果您能够精确地描述序列(如果希望计算机生成序列,则必须这样做),则可以通过
IEnumerable
返回序列。不幸的是,您提供的一点点代码不足以澄清您对
IEnumerable
(或其缺乏)局限性的明显误解。@B.ClayShannon code Review实际上是关于真实的、具体的,工作代码-这个问题有太多的
做点什么
而不能在CR上飞行。这个问题可能是关于这个主题的,但前提是你能做得更好。请提供一个更好的代码示例,即清楚地显示您正在尝试做什么的好代码,以及该代码的功能以及与您希望它做的不同之处的精确解释。堆栈溢出问题需要一个明确的问题陈述,到目前为止我还没有看到。
foreach
适用于具有
GetEnumerator()
、实现
IEnumerable
IEnumerable
的对象,是的。所以如何阻止您提供此类对象?如果您希望能够将它用作
foreach
的对象,为什么要使
ItemsEnumerator
实现
IEnumerator
而不是
IEnumerable
?或者,为什么不将它包装在使用它的
IEnumerable
对象中,例如在interator方法或专用对象中?这是一种有趣的方法,我不知道我在引用中是如何遗漏它的。
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;
   }
}