码迷,mamicode.com
首页 > 编程语言 > 详细

c# 迭代器 与 集合 IEnumerable.GetEnumerator 方法

时间:2015-04-21 14:30:43      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

示例来源 :msdn

 

 1.0 迭代器

简单的迭代器:

  public static void Main(string[] args)
        {
            foreach (int number in EvenSequence(5, 18))
            {
                Console.Write(number.ToString() + " ");
            }


            Console.ReadKey();
        }
        static IEnumerable<int> EvenSequence(int firstNumber, int lastNumber)
        {
            // Yield 偶数的范围.
            for (int number = firstNumber; number <= lastNumber; number++)
            {
                if (number % 2 == 0)
                {
                    yield return number;
                }
            }
        }

  

 

C# 语言的 foreach 语句隐藏了枚举数的复杂性。因此,建议使用 foreach,而不是直接操作枚举数。

枚举数可用于读取集合中的数据,但不能用于修改基础集合。

最初,枚举数被定位于集合中第一个元素的前面。 Reset 方法还会将枚举数返回到此位置。在此位置上,Current 属性未定义。 因此,在读取 Current 的值之前,必须调用 MoveNext 方法将枚举数提前到集合的第一个元素。

在调用 MoveNext 或 Reset 之前,Current 返回同一对象。 MoveNext 将 Current 设置为下一个元素。

如果 MoveNext 越过集合的末尾,则枚举数将放置在集合中最后一个元素的后面,而且 MoveNext 返回 false。 当枚举数位于此位置时,对 MoveNext 的后续调用也返回 false。 如果对 MoveNext 的最后一次调用返回 false,则 Current 为未定义。 若要再次将 Current 设置为集合的第一个元素,可以调用 Reset,然后再调用 MoveNext

只要集合保持不变,枚举数就保持有效。 如果对集合进行更改(如添加、修改或删除元素),则枚举数将失效且不可恢复,而且其行为是不确定的。

枚举数没有对集合的独占访问权;因此,从头到尾对一个集合进行枚举在本质上不是一个线程安全的过程。若要确保枚举过程中的线程安全,可以在整个枚举过程中锁定集合。若允许多个线程对集合执行读写操作,您必须实现自己的同步。

c# 迭代器 与 集合 IEnumerable.GetEnumerator 方法

标签:

原文地址:http://www.cnblogs.com/izhiniao/p/4444157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!