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

示例来源 :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

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

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

时间: 2024-08-10 00:22:33

c# 迭代器 与 集合 IEnumerable.GetEnumerator 方法的相关文章

C# 索引器,实现IEnumerable接口的GetEnumerator()方法

当自定义类需要实现索引时,可以在类中实现索引器. 用Table作为例子,Table由多个Row组成,Row由多个Cell组成, 我们需要实现自定义的table[0],row[0] 索引器定义格式为 [修饰符] 数据类型 this[索引类型 index] 以下是代码 1 /// <summary> 2 /// 单元格 3 /// </summary> 4 public class Cell 5 { 6 /// <summary> 7 /// Value 8 /// <

List,Set,Map集合的遍历方法

List的三种实现:ArrayList(数组)  LinkedList(链表)  Vector(线程安全) List集合遍历方法: List<String> list = new ArrayList<String>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); /* * list遍历有三种方法:普通for 迭代器 增强for * */ //使用普通for遍历 f

集合框架(一) ----------Map集合遍历的方法

import java.util.*; /** * Map集合遍历的方法 * @author Administrator * */public class Test2 { public static void main(String[] args) { Map<String,String> map=new HashMap<String,String>(); /*Java 提供两种不同的类型: * 引用类型和原始类型(或内置类型). * Int是java的原始数据类型, * Inte

黑马程序员——java——集合 Vcetor 基本方法演示

集合   Vcetor  基本方法演示 import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; public class VectorDemos { public static void main(String[] args) { // 新建一个容器 Vector v = new Vector(); v.addElement("abb1"); v.addElement("

JAVA-初步认识-常用对象API(集合框架-重点方法entryset演示图解)

一. 对于上一节的操作而言,这里还有另外一种做法,相对而言,有一点麻烦. 从刚才的动作,总结出一个原理.map集合没有迭代器,但是我们可以把map转换成有迭代器的集合,比如说set. 这是为什么呢?为什么不返回arrylist,这是拿所有的键,键是唯一的,所以返回的应该是set集合,保证元素的唯一性. 接下来,在API当中,还有一个方法也是返回set集合,(这里的set有什么特殊含义么?) 现在用它来完成取出所有元素的方式.keyset大家比较容易明白,里面装的都是键.但是,entryset是返

迭代器--遍历集合的专用工具

[不使用迭代器遍历集合] 1 package com.hxl; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Collection; 6 7 public class Test { 8 9 public static void main(String[] args) { 10 // 实例化一个集合对象 11 Collection c = new ArrayList<>(); 12 //

学习集合Collection_通用方法

Collection 常用接口 集合List和Set通用的方法 public boolean add(E e) 添加对象到集合 public boolean remove(E e) 删除指定元素 public void clear() 清空集合中元素 public boolean contains(E e) 判断是否包含元素 public boolean isEmpty() 判断当前集合是否为空 public int size() 返回集合中元素个数 public Object[] toArra

集合,迭代器遍历集合,嵌套集合

集合的框架图 什么是集合? 集合有两个父接口:collection 和  Map collection有两个子接口:List 和 Set List :子接口有两个常用的实现类ArrayList和LinkedList    存储的数据的方式是有序不唯一的 ArrayList其实可以理解为一个可变长度的数组,可以通过索引访问相对应的元素 ArrayList遍历元素和查找指定元素效率比较高 Linkedlist对元素的增删改时效率比较高  而且LinkedList有几个独有的方法,addFrist()

集合-字典 方法练习

- (void)viewDidLoad { [super viewDidLoad]; //用一个或多个键值对初始化一个字典对象,以值,键,值,键,值,键,...,nil的顺序 NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@1,@"key1",@2,@"key2",@3,@"key3" ,nil]; NSLog(@"dict:%@",dict