c# 命名迭代器
classProgram{staticvoidMain(string[]args){Class1c=newClass1();foreach(intiinc.MaxToMi...
class Program
{
static void Main(string[] args)
{
Class1 c = new Class1();
foreach (int i in c.MaxToMin(1, 2))
{
Console.WriteLine(i);
}
}
}
class Class1
{
// 定义一个命名的迭代器,并可以提供参数
public IEnumerable MaxToMin(int min, int max)
{
for (int i = max; i >= min; i--)
{
yield return i;
}
}
}
如上代码可以正常运行。问题是 :Class1并不是可枚举的类型,只是类的方法中定义了一个迭代器方法。为什么它就可以foreach遍历了?谢谢! 展开
{
static void Main(string[] args)
{
Class1 c = new Class1();
foreach (int i in c.MaxToMin(1, 2))
{
Console.WriteLine(i);
}
}
}
class Class1
{
// 定义一个命名的迭代器,并可以提供参数
public IEnumerable MaxToMin(int min, int max)
{
for (int i = max; i >= min; i--)
{
yield return i;
}
}
}
如上代码可以正常运行。问题是 :Class1并不是可枚举的类型,只是类的方法中定义了一个迭代器方法。为什么它就可以foreach遍历了?谢谢! 展开
3个回答
展开全部
这个问题,要说清楚,也许会有点长。我试试看说不说得清楚。
IEnumerable这个接口表明,实现该接口的类,可以被迭代。而IEnumerable的接口,有一个GetEnumerator()方法,该方法返回IEnumerator接口(这个接口的作用,请看第二点)
IEnumerator这个接口表明,迭代的具体实现,这也就说明了,为什么IEnumerable接口中唯一一个GetEnumerator()方法返回IEnumerator类型。
yield这个关键字,只能用于return与break之前。这个关键字,我并不是太理解。我只能看实现,然后好像意会到这个关键字存在的意义。
IEnumerable接口,如果被一个类实现,那么这个类中必须有可以迭代的元素(元素实现了IEnumerator);如果作为一个方法的返回值,那么表示这个方法是一个迭代方法。
哎~~~,这个问题,我回答的不是很好。第四点,说出了,为什么。因为这就是IEnumerable的用法。被类实现与作为一个方法的返回值。如果想弄明白,还是推荐在msdn上面,好好研究一下IEnumerable与IEnumerator。还有就是yield,可以简化实现的过程。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
foreach的对象是IEnumerable类型的,你的MaxToMin返回的就是这个类型,所以就可以被遍历了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询