一个集合的要求是什么,这样我们才能在上面加上foreach
本文关键字:我们 在上面 foreach 是什么 一个 集合 | 更新日期: 2023-09-27 18:25:49
为了在c#中放置foreach,对集合的要求是什么?我们可以为每种类型设置哪些类型?
第1版:有人能想出一个实现Foreach的用户定义集合的示例代码吗。
它实现IEnumerable
或IEnumerable<T>
编辑:如果类型有一个名为GetEnumerator()的方法,它返回一个IEnumerator,那么它也可以在foreach中使用。看见http://brendan.enrick.com/post/Foreach-IEnumerable-IEnumerator-and-Duck-Typing.aspx
通常接受的是,您需要实现IEnumerable
或IEnumerable<T>
,但您可以从Eric的帖子中了解到。遵循以下模式,并非如此
所需的是集合的类型必须具有公共方法,并且必须返回某个具有名为Current的公共属性getter和一个公共方法MoveNext返回bool。
唯一的形式要求是它有一个名为GetEnumerator()
的方法,该方法返回具有SomeType Current {get;}
属性和bool MoveNext()
方法的东西。然而,最常见的是,这是通过实现IEnumerable
/IEnumerable<T>
接口来实现的。事实上,预期您将实现此接口(旧方法实际上是作为泛型前的优化),使用该接口将允许消费者将您的集合与LINQ和集合初始化器等一起使用。
在有趣的情况下,实现这种方法的最简单方法是通过"迭代器块"。例如:
class Foo : IEnumerable<int> {
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
public IEnumerator<int> GetEnumerator() {
yield return 16;
yield return 12;
yield return 31;
// ^^ now imagine the above was a loop over some internal structure -
// for example an array, list, linked-list, etc, with a "yield return"
// per item
}
}