首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

求问下C#迭署理解

2013-08-01 
求问下C#迭代理解foreach就是迭代吗 怎么理解 还有程序中的迭代器和这是一个概念么 新手勿怪迭代C#[解决办

求问下C#迭代理解
foreach就是迭代吗 怎么理解 还有程序中的迭代器和这是一个概念么求问下C#迭署理解 新手勿怪 迭代 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;
}

[解决办法]
引用:
迭代和循环是不同的,迭代这个概念说起来有些复杂,涉及到状态机——这个在计算机科学中普遍用到的概念。

所谓状态机,你可以简单理解为一个黑盒,它的输出取决于输入和自身的状态。我们有时候把函数也当成一个黑盒,和状态机不同,函数(这里说的是无状态的函数)的输出只取决于输入。

迭代器好比这样一个装置,它有一个状态,并且允许你不断获取输出结果。当你获得一个输出结果之后,它的状态发生改变,再次获取输出,获取的就是序列的下一个结果。遍历迭代器比直接循环强在,迭代器内部维护着状态,这使得我们可以分多次取得数据而不用借助额外的循环变量(事实上循环本身相当于一个外迭代器)。

看如下对比代码:

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#迭代器的妙处。

如果死扣字眼,用比较肤浅的“迭代”概念来涵盖迭代器,这就好像说“吃维生素治百病”一样,其实没有什么疗效。

热点排行