>백엔드 개발 >C#.Net 튜토리얼 >C# IEnumerable 및 IEnumerator 인터페이스에 대한 간략한 소개

C# IEnumerable 및 IEnumerator 인터페이스에 대한 간략한 소개

黄舟
黄舟원래의
2017-03-21 11:22:485420검색

이 글에서는 C#의 IEnumerable 및 IEnumerator 인터페이스에 대한 관련 지식을 주로 소개하는데, 참고할만한 가치가 매우 높습니다.

리뷰를 통해 살펴보겠습니다. 과거를 배우고 새로운 것을 배울 수 있습니다. 시간이 있을 때 기본 지식을 자주 복습하는 것이 필요하며 이를 통해 이해와 기억이 깊어질 수 있습니다.

Foreach는 컬렉션을 반복하고 IEnumerable 인터페이스를 구현하는 컨테이너를 탐색하는 데 종종 사용됩니다. 공식 설명에 따르면 IEnumerable은 열거자 인터페이스이고 IEnumerator는 약간 혼란스럽습니다. 인터페이스는 문자 그대로의 의미와 크게 다르지 않습니다. 하나씩 분석해 보겠습니다.

IEnumerable 인터페이스

public interface IEnumerable
{ 
 IEnumerator GetEnumerator();
}

IEnumerable 인터페이스를 상속하는 클래스는 노출된 GetEnumerator() 메서드를 구현하고 IEnumerator 인터페이스 개체를 반환해야 합니다. 실제로 작업을 수행하는 것은 IEnumerator에 있는 내용을 확인하기 위한 F12입니다.

IEnumerator 인터페이스

public interface IEnumerator
{ 
 object Current { get; }
 bool MoveNext(); 
 void Reset();
}

IEnumerator 인터페이스에는 세 가지가 있습니다. 하나는 속성Current이고 현재 컬렉션의 요소를 반환하는 MoveNext( ) 이동 다음으로 이동하면 순회가 모두 역순회가 아닌가요? Reset()은 말 그대로 재설정을 의미합니다. 가설을 세웁니다. IEnumerable 인터페이스가 IEnumerator 인터페이스 반복자를 반환하므로 IEnumerator 반복자 인터페이스만 상속하여 사용자 지정 컨테이너를 구현할 수 있습니까?

Phone 클래스

public class Phone 
{
 public string Name;
 public Phone(string name)
 {
  this.Name = name;
 }
}

MyEnumerator라는 이름의 반복자를 정의하고 IEnumerator

public class MyEnumerator : IEnumerator
{
 Phone[] p;
 int idx = -1;
 public MyEnumerator(Phone[] t)
 {
  p = t;
 }
 public object Current
 {
  get
  {
  if (idx == -1)
   return new IndexOutOfRangeException();
  return p[idx];
  }
 }
 public bool MoveNext()
 {
  idx++;
  return p.Length > idx;
 }
 public void Reset()
 {
  idx = -1;
 }
}
class Program
 {
 static void Main(string[] args)
 {
       show("-----------IEnumerator------------");
  Phone[] phones = new Phone[] { new Phone("iPhone 7s"), new Phone("iPhone 6s"), new Phone("iPhone 5s") };
  MyEnumerator enumerator = new MyEnumerator(phones);
  while (enumerator.MoveNext())
  {
  Phone p = enumerator.Current as Phone;
  show(p.Name);
  }
  Console.ReadKey();
 }
 static void show(string i)
 {
  Console.WriteLine(i);
 }
 }
결과는 다음과 같습니다.

예상대로 실제로 작업을 수행하는 것은 사용자 지정 컨테이너를 반복할 수 있는 IEnumerator 인터페이스입니다. 그러나 원래 의도는 제가 원하는 것입니다. 루프 액세스 및 순회를 위해 Foreach를 사용합니다. 그러면 IEnumerable 인터페이스만 표시하여 이를 수행할 수 있습니다. Phone 클래스를 약간 변형합니다:

public class Phone : IEnumerable
 {
 public string Name ;
 public Phone(string name)
 {
  this.Name = name;
 }
 Phone[] p;
 public Phone(Phone[] t)
 {
  p = t;
 }
 public IEnumerator GetEnumerator()
 {
  return new MyEnumerator(p);
 }
 }
static void Main(string[] args)
 {
  show("-----------IEnumerator------------");
  Phone[] phones = new Phone[] { new Phone("iPhone 7s"), new Phone("iPhone 6s"), new Phone("iPhone 5s") };
  MyEnumerator enumerator = new MyEnumerator(phones);
  while (enumerator.MoveNext())
  {
  Phone p = enumerator.Current as Phone;
  show(p.Name);
  }
  show("-----------IEnumerable------------");
  Phone phoneList = new Phone(phones);
  foreach (Phone p in phoneList)
  {
  show(p.Name);
  }
  Console.ReadKey();
 }

결과는 다음과 같습니다.

완료된 다음 일반 컨테이너

PhonePackage로 확장합니다. , 일반 IEnumerable8742468051c85b06f0a0af9e3e506b5c 인터페이스를 상속받습니다.

public class PhonePackage<T> : IEnumerable<T> 
 {
 private List<T> dataList = null;
 public void Add(T t)
 {
  if (dataList == null)
  dataList = new List<T>();
  dataList.Add(t);
 }
 public IEnumerator<T> GetEnumerator()
 {
  foreach (T t in dataList)
  {
  yield return t;
  }
 }
 IEnumerator IEnumerable.GetEnumerator()
 {
  foreach (T t in dataList)
  {
  yield return t;
  }
 }
 }
rrree

결과는 다음과 같습니다.

IEnumerator 반복자 인터페이스는 매우 장황하며 Yield는 순회를 단순화하는 구문 설탕일 뿐입니다.

위 내용은 C# IEnumerable 및 IEnumerator 인터페이스에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.