求问下C#迭代理解

夏至夏未了 2013-07-22 03:51:38
foreach就是迭代吗 怎么理解 还有程序中的迭代器和这是一个概念么 新手勿怪
...全文
532 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
please_call_me_J 2013-07-23
  • 打赏
  • 举报
回复
http://dotnet.9sssd.com/csbase/art/794 楼主仔细读读读读这个就知道关于遍历的东西了
夏至夏未了 2013-07-23
  • 打赏
  • 举报
回复
谢谢各位大神 还得自己琢磨下
  • 打赏
  • 举报
回复
引用 3 楼 juyangjia 的回复:
为楼上大神画蛇添足一下:迭代=遍历=循环,迭代器就是用来实现迭代的东西,如2楼所说,实现IEnumerable接口的方法即可使用foreach迭代。 附上迭代器设计模式代码: [code=csharp]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; .........
晕死! 我郑重声明,了解所谓c#迭代器,请从yield return、yield break语句开始!
  • 打赏
  • 举报
回复
c#语言的迭代器(注意,它属于c#,而不是.net框架),实际上是实现“递归变迭代”的自动化代码生成功能。 因此你要熟练写出大量实用的递归程序,然后你自己亲自进行代码展开,把递归的算法变成迭代的算法。然后你才能理解c#迭代器的妙处。 如果死扣字眼,用比较肤浅的“迭代”概念来涵盖迭代器,这就好像说“吃维生素治百病”一样,其实没有什么疗效。
threenewbee 2013-07-22
  • 打赏
  • 举报
回复
引用 6 楼 caozhy 的回复:
迭代和循环是不同的,迭代这个概念说起来有些复杂,涉及到状态机——这个在计算机科学中普遍用到的概念。 所谓状态机,你可以简单理解为一个黑盒,它的输出取决于输入和自身的状态。我们有时候把函数也当成一个黑盒,和状态机不同,函数(这里说的是无状态的函数)的输出只取决于输入。 迭代器好比这样一个装置,它有一个状态,并且允许你不断获取输出结果。当你获得一个输出结果之后,它的状态发生改变,再次获取输出,获取的就是序列的下一个结果。遍历迭代器比直接循环强在,迭代器内部维护着状态,这使得我们可以分多次取得数据而不用借助额外的循环变量(事实上循环本身相当于一个外迭代器)。 看如下对比代码:
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毫秒。
threenewbee 2013-07-22
  • 打赏
  • 举报
回复
迭代和循环是不同的,迭代这个概念说起来有些复杂,涉及到状态机——这个在计算机科学中普遍用到的概念。 所谓状态机,你可以简单理解为一个黑盒,它的输出取决于输入和自身的状态。我们有时候把函数也当成一个黑盒,和状态机不同,函数(这里说的是无状态的函数)的输出只取决于输入。 迭代器好比这样一个装置,它有一个状态,并且允许你不断获取输出结果。当你获得一个输出结果之后,它的状态发生改变,再次获取输出,获取的就是序列的下一个结果。遍历迭代器比直接循环强在,迭代器内部维护着状态,这使得我们可以分多次取得数据而不用借助额外的循环变量(事实上循环本身相当于一个外迭代器)。 看如下对比代码:
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;
}
threenewbee 2013-07-22
  • 打赏
  • 举报
回复
foreach不是迭代,它是遍历。 foreach和Enumerator的关系好比驾驶员和汽车的关系。
人生导师 2013-07-22
  • 打赏
  • 举报
回复
please_call_me_J 2013-07-22
  • 打赏
  • 举报
回复
为楼上大神画蛇添足一下:迭代=遍历=循环,迭代器就是用来实现迭代的东西,如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();
        }
    }
  • 打赏
  • 举报
回复
foreach关键字用来遍历迭代器IEnumerator,要求必须实现IEnumerable接口
全栈极简 2013-07-22
  • 打赏
  • 举报
回复
可以这么理解。

111,101

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧