C# IEnumerable および IEnumerator インターフェイスの簡単な紹介

黄舟
リリース: 2017-03-21 11:22:48
オリジナル
5381 人が閲覧しました

この記事では主に C# の IEnumerable および IEnumerator インターフェイスに関する関連知識を紹介します。これは、エディターで見てみましょう

古いものを振り返り、新しいものを学ぶことができます。時間があるときに何度も復習してください。基礎知識が必要であり、理解と記憶が深まります。

Foreach は、IEnumerable インターフェイスを実装するコレクションを反復処理したり、コンテナーを走査したりするためによく使用されます。公式の説明によれば、IEnumerable は列挙型インターフェイスであり、IEnumerator は反復子インターフェイスです。文字通り、意味はそれほど変わりません。一つずつ分析してみましょう。

IEnumerable インターフェイス

public interface IEnumerable
{ 
 IEnumerator GetEnumerator();
}
ログイン後にコピー

IEnumerable インターフェイスを継承するクラスは、公開された GetEnumerator() メソッドを実装し、IEnumerator インターフェイス オブジェクトを返す必要があります。IEnumerator で実際に何が行われているかを確認するには、IEnumerator が実際に機能しているようです。 。

IEnumerator インターフェース

public interface IEnumerator
{ 
 object Current { get; }
 bool MoveNext(); 
 void Reset();
}
ログイン後にコピー

IEnumerator インターフェースには 3 つの要素があり、1 つは現在のコレクション内の要素を返す

attributeCurrent メソッドです。これは、メソッド 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

に展開し、汎用の IEnumerable インターフェイスを継承するだけです。

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;
  }
 }
 }
ログイン後にコピー
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);
  }
  show("-----------IEnumerable<T>------------");
  PhonePackage<Phone> phonePackage = new PhonePackage<Phone>();
  phonePackage.Add(new Phone("iPhone 7s"));
  phonePackage.Add(new Phone("iPhone 6s"));
  phonePackage.Add(new Phone("iPhone 5s"));
  foreach (Phone p in phonePackage)
  {
  show(p.Name);
  }
  Console.ReadKey();
 }
 static void show(string i)
 {
  Console.WriteLine(i);
 }
ログイン後にコピー
結果は次のようになります:

IEnumerator イテレータ インターフェイスは非常に冗長であり、yield はトラバーサルを簡素化する単なる構文糖です。

以上がC# IEnumerable および IEnumerator インターフェイスの簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート