我似乎记得一个可以实现的接口,它基本上有一个必须返回IEnumerable
对象的方法,实现这个接口将允许您在对象上使用foreach
。有人能告诉我这个界面是什么吗?如果我记错了,可以纠正我吗?
编辑:对不起,伙计们,我刚刚意识到我脑子里有两件事。我不认为我刚才要求的存在,但我过去(现在仍然)试图想到的是一个你可以实现的接口,而不是IList或IEnumerable(我忘了是哪个),它有一个方法,可以让你只返回该类型的对象,而不是实际实现IList(或IEnumarable?)接口。
所以。。。问题略有不同,但对我来说仍然一样重要。
编辑:IListSource是我一直在想的。抱歉大家考虑不周的问题。啊,好吧,它们不可能都是好的:)
IEnumerable<T> has one method to return an IEnumerator<T>
IEnumerator<T> has methods like MoveNext and Current
它是IEnumerable
(或等效的泛型IEnumerable<T>
),它有一个GetEnumerator
方法,返回IEnumerator
或IEnumerator<T>
。
当您实现该方法时,您可以在另一个集合(例如,您自己类中的列表)上调用GetEnumerator
,也可以使用迭代器块来执行更多自定义迭代。
如果你在做你需要做的事情时遇到任何问题,请发布更多详细信息,我们可以提供更多帮助。
EInumerable<T>
接口(以及非通用IEnumerable
接口)用于使类可枚举。
您可以这样实现IEnumerable<T>
:
public class MyClass : IEnumerable<Item> {
public IEnumerator<Container<T>> GetEnumerator() {
// here you return your items, for example by returning an enumerator:
return someArray.GetEnumerator();
// or by using yield return:
for (int i = 0; i < 10; i++) {
yield return new Item(i);
}
}
// this is needed, because IEnumerable<T> inherits IEnumerable
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
// uses the generic implementation
return GetEnumerator();
}
}
编辑:
foreach
语句使用的是鸭子类型,而不是IEnumerable<T>
接口,因此您实际上不需要实现该接口来使用foreach
语句中的类。您只需实现GetEnumerator
方法。
IEnumberable
(通用IEnumberable<T>
)的对象需要实现GetEnumerator
。使用该方法可以得到强类型的IEnumerator
,在IEnumberable<T>
使用方法的情况下,可以得到泛型的IEnumerator
。
IEnumerator
提供类似的方法
- 生成集合中下一个项目的
MoveNext
Reset
,它将枚举器重置到其初始位置,即集合中第一个元素之前的位置
使用它可以对集合进行迭代。
Iterator块允许您"生成返回"类型为T
的对象,而不是创建实现IEnumerable<T>
的类型。例如:
IEnumerable<int> PrimesLessThanTen()
{
yield return 2;
yield return 3;
yield return 5;
yield return 7;
}
或
IEnumerable<byte> OddBytes()
{
byte b = 1;
do
{
yield return b;
b += 2;
} while (b != 1);
}