C#带foreach循环的IEnumerator,最佳设计模式?
我知道以前也有人问过类似的问题,但在试图找到我能使用的最佳设计模式时,我已经走到了死胡同 我试图用一个工厂类创建一个类库,该工厂类通过方法调用为不同的项提供枚举器。 注意:这些项目在集合中不存在,只能在知道前一个项目的情况下创建。(例如,x(i)=x(i-1)+θ),因此我无法将这些项实现为IEnumerable(s) 我之前的想法: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
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;
}
}