C#中IEnumerable接口用法实例分析

作者:heishui 时间:2022-03-24 12:40:21 

本文实例讲述了C#中IEnumerable接口用法。分享给大家供大家参考。具体分析如下:

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

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

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

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

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

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

下面的代码示例演示如何实现自定义集合的 IEnumerable 接口。在此示例中,没有显式调用但实现了 GetEnumerator,以便支持使用 foreach(在 Visual Basic 中为 For Each)。此代码示例摘自 IEnumerable 接口的一个更大的示例。


using System;
using System.Collections;
public class Person
{
public Person(string fName, string lName)
{
 this.firstName = fName;
 this.lastName = lName;
}
public string firstName;
public string lastName;
}
public class People : IEnumerable
{
private Person[] _people;
public People(Person[] pArray)
{
 _people = new Person[pArray.Length];
 for (int i = 0; i < pArray.Length; i++)
 {
  _people[i] = pArray[i];
 }
}
IEnumerator IEnumerable.GetEnumerator()
{
 return (IEnumerator) GetEnumerator();
}
public PeopleEnum GetEnumerator()
{
 return new PeopleEnum(_people);
}
}
public class PeopleEnum : IEnumerator
{
public Person[] _people;
// Enumerators are positioned before the first element
// until the first MoveNext() call.
int position = -1;
public PeopleEnum(Person[] list)
{
 _people = list;
}
public bool MoveNext()
{
 position++;
 return (position < _people.Length);
}
public void Reset()
{
 position = -1;
}
object IEnumerator.Current
{
 get
 {
  return Current;
 }
}
public Person Current
{
 get
 {
  try
  {
   return _people[position];
  }
  catch (IndexOutOfRangeException)
  {
   throw new InvalidOperationException();
  }
 }
}
}
class App
{
static void Main()
{
 Person[] peopleArray = new Person[3]
 {
  new Person("John", "Smith"),
  new Person("Jim", "Johnson"),
  new Person("Sue", "Rabon"),
 };
 People peopleList = new People(peopleArray);
 foreach (Person p in peopleList)
  Console.WriteLine(p.firstName + " " + p.lastName);
}
}
/* This code produces output similar to the following:
*
* John Smith
* Jim Johnson
* Sue Rabon
*
*/

希望本文所述对大家的C#程序设计有所帮助。

标签:C#,接口
0
投稿

猜你喜欢

  • java设计模式之工厂方法模式

    2022-08-29 05:14:10
  • Java 多线程并发LockSupport

    2022-04-07 23:59:57
  • java mybatis框架配置详解

    2023-11-25 08:09:16
  • C#中WPF ListView绑定数据的实例详解

    2023-03-11 12:08:41
  • C#实现用于操作wav声音文件的类实例

    2021-08-15 22:06:25
  • Idea如何导入一个SpringBoot项目的方法(图文教程)

    2022-08-10 22:40:49
  • 详解JAVA流程控制语句

    2023-11-05 02:27:09
  • Spring5学习之基础知识总结

    2021-08-16 02:19:15
  • 浅谈C# StringBuilder内存碎片对性能的影响

    2023-12-15 08:55:47
  • Java实现的基于socket通信的实例代码

    2021-12-30 19:06:50
  • SpringBoot实现简单文件上传功能

    2021-07-22 21:52:49
  • json格式数据分析工具PageElement类分享(仿Session写法)

    2023-09-16 16:04:32
  • C#实现redis读写的方法

    2023-07-13 16:21:35
  • C#实现随鼠标移动窗体实例

    2022-05-16 11:09:31
  • SpringCloud feign无法注入接口的问题

    2021-09-04 03:26:29
  • Android仿微信Viewpager-Fragment惰性加载(lazy-loading)

    2023-12-16 23:50:59
  • Android上传文件到服务端并显示进度条

    2023-06-23 07:48:33
  • Android ActionBar完全解析使用官方推荐的最佳导航栏(下)

    2022-04-27 02:35:03
  • C#实现通过程序自动抓取远程Web网页信息的代码

    2023-12-04 22:56:46
  • struts中动态方法调用使用通配符

    2023-02-01 02:52:43
  • asp之家 软件编程 m.aspxhome.com