求问下C#迭代理解
foreach就是迭代吗 怎么理解 还有程序中的迭代器和这是一个概念么 新手勿怪 迭代 C#
[解决办法]
可以这么理解。
[解决办法]
foreach关键字用来遍历迭代器IEnumerator,要求必须实现IEnumerable接口
[解决办法]
为楼上大神画蛇添足一下:迭代=遍历=循环,迭代器就是用来实现迭代的东西,如2楼所说,实现IEnumerable接口的方法即可使用foreach迭代。
附上迭代器设计模式代码:
public interface ICollection
{
object this[int i] { get; set; }
int Count { get; }
/// /// 获取迭代器 ///
/// /// 迭代器
Iterator GetIterator();
}
/// /// 迭代器接口 ///
public interface Iterator
{
bool MoveNext();
object Current { get; }
}
public class List : ICollection
{
private const int MAX = 10;
private object[] items;
public List()
{
items = new object[MAX];
}
public object this[int i]
{
get
{
return items[i];
}
set
{
this.items[i] = value;
}
}
#region ICollection Members
public int Count
{
get
{
return items.Length;
}
}
public Iterator GetIterator()
{
return new ListIterator(this);
}
#endregion
}
public class ListIterator : Iterator
{
private int index = 0;
private ICollection list;
public ListIterator(ICollection list)
{
this.list = list;
index = 0;
}
#region Iterator Members
public bool MoveNext()
{
if (index + 1 > list.Count) return false;
else
{
index++;
return true;
}
}
public object Current
{
get
{
return list[index];
}
}
#endregion
}
class Program
{
static void Main(string[] args)
{
ICollection list = new List();
Iterator iterator = list.GetIterator();
while (iterator.MoveNext())
{
object current = iterator.Current;
}
Console.Read();
}
}
[解决办法]
参考这个博客来理解下:http://www.cnblogs.com/zhili/archive/2012/12/02/Interator.html
[解决办法]
foreach不是迭代,它是遍历。
foreach和Enumerator的关系好比驾驶员和汽车的关系。
[解决办法]
迭代和循环是不同的,迭代这个概念说起来有些复杂,涉及到状态机——这个在计算机科学中普遍用到的概念。
所谓状态机,你可以简单理解为一个黑盒,它的输出取决于输入和自身的状态。我们有时候把函数也当成一个黑盒,和状态机不同,函数(这里说的是无状态的函数)的输出只取决于输入。
迭代器好比这样一个装置,它有一个状态,并且允许你不断获取输出结果。当你获得一个输出结果之后,它的状态发生改变,再次获取输出,获取的就是序列的下一个结果。遍历迭代器比直接循环强在,迭代器内部维护着状态,这使得我们可以分多次取得数据而不用借助额外的循环变量(事实上循环本身相当于一个外迭代器)。
看如下对比代码:
int start = 0;
while (start < arr.Length)
{
for (int i = start; i < arr.Length - 1; i++)
{
start++;
if (arr[i] > 0)
{
Console.WriteLine(arr[i]);
break;
}
}
Console.Write("是否继续(y/n)");
if (Console.ReadLine().ToLowCase() != "y") break;
}
用迭代器写:
var itor = arr.GetEnumerator();
itor.Reset();
while (itor.MoveNext())
{
if (itor.Current > 0)
{
Console.WriteLine(itor.Current);
break;
}
Console.Write("是否继续(y/n)");
if (Console.ReadLine().ToLowCase() != "y") break;
}
[解决办法]
这个例子举得不好。
你会问,为什么我们需要一个额外的状态。
考虑这样一种情况。假设数组是靠链表实现的(实际上是线性表,但是我们这里假设)。
当你使用arr[i]访问数组的一个元素的时候,它必须从数组的开头开始找起。
我们假设访问一个节点需要1毫秒。
那么我们写
for (i = 1; i < 5; i++)
{
arr[i]
}
需要1+2+3+4+5=15毫秒。
但是如果我们使用迭代器,在内部始终保持着最后一个访问的节点,那么我们遍历同样的数组,只要1+1+1+1+1=5毫秒。
[解决办法]
c#语言的迭代器(注意,它属于c#,而不是.net框架),实际上是实现“递归变迭代”的自动化代码生成功能。
因此你要熟练写出大量实用的递归程序,然后你自己亲自进行代码展开,把递归的算法变成迭代的算法。然后你才能理解c#迭代器的妙处。
如果死扣字眼,用比较肤浅的“迭代”概念来涵盖迭代器,这就好像说“吃维生素治百病”一样,其实没有什么疗效。