誰でもできるので説明IEnumerableとIEnumeratorて頂けますか?[定休日]

StackOverflow https://stackoverflow.com/questions/558304

  •  05-09-2019
  •  | 
  •  

質問

誰でもできるので説明IEnumerableとIEnumeratorて頂けますか?

例えば、使用でforeach?の違いについて教えてくださいIEnumerableとIEnumerator?なぜ必要がありま使用すればいいですか?

役に立ちましたか?

解決

  

たとえば、ときのforeachの上にそれを使用するには?

あなたはIEnumerable "上" foreachを使用しないでください。 IEnumerableを実装するの

foreach の可能性を使用します

あなたのようなコードを書くときます:

foreach (Foo bar in baz)
{
   ...
}

それは書き込みと機能的に同等です。

IEnumerator bat = baz.GetEnumerator();
while (bat.MoveNext())
{
   bar = (Foo)bat.Current
   ...
}

で「機能的に同等、」私は、コンパイラがにコードを回す何実際のです意味します。あなたは、のない限り、foreachbazを実装して、この例ではbazIEnumerableを使用することはできません。

IEnumerablebazメソッドを実装していることを意味する

IEnumerator GetEnumerator()

このメソッドの戻りメソッドを実装しなければならないことIEnumeratorオブジェクト

bool MoveNext()

Object Current()

第一の方法は、それを行うの場合IEnumerableを返し、列挙子を作成falseオブジェクト内の次のオブジェクトに進み、第二は、現在のオブジェクトを返す。

あなたが実装さIEnumerableを反復処理することができます。ネットで何か。独自のクラスを構築している、そしてそれはすでにIEnumerableを実装するクラスから継承していない場合は、foreachを実装することによって(とその新しいIEnumerableメソッドが返す列挙子クラスを作成することによって)GetEnumerator文のクラスを使用可能にすることができますます。

他のヒント

のIEnumerableとのIEnumeratorインターフェイス

の役割で、既存の.NETインタフェースを実装するプロセスを検討開始するには、みましょう初見 IEnumerableをとのIEnumerator。 C#はあなたがすることができますキーワードという名前のforeachをサポートしていることを思い出してください 任意の配列型の内容を反復処理

// Iterate over an array of items.
int[] myArrayOfInts = {10, 20, 30, 40};
foreach(int i in myArrayOfInts)
{
   Console.WriteLine(i);
}
それが唯一の配列型は、この構造を利用することができるように見えるかもしれませんが、

は、問題の真実があります GetEnumeratorメソッド()という名前のメソッドをサポートする任意のタイプのforeachによって評価することができるconstruct.To 説明、私に従ってください!

私たちはガレージクラスがあるとします:

// Garage contains a set of Car objects.
public class Garage
{
   private Car[] carArray = new Car[4];
   // Fill with some Car objects upon startup.
   public Garage()
   {
      carArray[0] = new Car("Rusty", 30);
      carArray[1] = new Car("Clunker", 55);
      carArray[2] = new Car("Zippy", 30);
      carArray[3] = new Car("Fred", 30);
   }
}

理想的には、foreachのを使用してガレージオブジェクトのサブ項目を反復処理するために便利です 単にデータ値の配列のように、構築します:

// This seems reasonable ...
public class Program
{
   static void Main(string[] args)
   {
      Console.WriteLine("***** Fun with IEnumerable / IEnumerator *****\n");
      Garage carLot = new Garage();
      // Hand over each car in the collection?
      foreach (Car c in carLot)
      {
         Console.WriteLine("{0} is going {1} MPH",
         c.PetName, c.CurrentSpeed);
      }
      Console.ReadLine();
   }
}

悲しいことに、コンパイラはガレージクラスは、名前のメソッドを実装していないことを知らせます GetEnumeratorメソッド()。この方法は、にSystem.Collections名前空間内に潜んで発見されたIEnumerableインターフェイスによって定式化されます。 この動作をサポートするクラスまたは構造は、彼らが含まれている公開できることを宣伝します 呼び出し元にサブ項目(この例では、foreachのキーワードそのもの)。ここでは、この標準の.NETインターフェイスの定義は、次のとおりです。

// This interface informs the caller
// that the object's subitems can be enumerated.
public interface IEnumerable
{
   IEnumerator GetEnumerator();
}
あなたが見ることができるように

、GetEnumeratorメソッド()メソッドは、指定されたさらに別のインターフェイスへの参照を返します。 System.Collections.IEnumerator。このインタフェースは、呼び出し元がIEnumerableを互換コンテナに含まれる内部オブジェクトを横断できるようにするインフラストラクチャを提供します:

// This interface allows the caller to
// obtain a container's subitems.
public interface IEnumerator
{
   bool MoveNext (); // Advance the internal position of the cursor.
   object Current { get;} // Get the current item (read-only property).
   void Reset (); // Reset the cursor before the first member.
}
あなたはこれらのインターフェイスをサポートするためにガレージタイプを更新したい場合は、

、あなたは長い道のりを取ることができるし、 手動で各方法を実施します。あなたは確かにカスタマイズされたバージョンを提供して自由ですが GetEnumeratorメソッド()、MoveNextメソッド()、現在、およびリセット()、簡単な方法があります。 System.Arrayタイプ(だけでなく、他の多くのコレクションクラス)は、既にIEnumerableをとのIEnumeratorを実装して、以下のように、あなたは、単にのSystem.Arrayに要求を委任することができます:

using System.Collections;
...
public class Garage : IEnumerable
{
   // System.Array already implements IEnumerator!
   private Car[] carArray = new Car[4];
   public Garage()
   {
      carArray[0] = new Car("FeeFee", 200);
      carArray[1] = new Car("Clunker", 90);
      carArray[2] = new Car("Zippy", 30);
      carArray[3] = new Car("Fred", 30);
   }
   public IEnumerator GetEnumerator()
   {
      // Return the array object's IEnumerator.
      return carArray.GetEnumerator();
   }
}
あなたのガレージの種類を更新した後、

、あなたは安全にC#のforeach構文内タイプを使用することができます。また、GetEnumeratorメソッド()メソッドが公に定義されていることを考えると、対象ユーザものIEnumeratorタイプと相互作用することができる:

// Manually work with IEnumerator.
IEnumerator i = carLot.GetEnumerator();
i.MoveNext();
Car myCar = (Car)i.Current;
Console.WriteLine("{0} is going {1} MPH", myCar.PetName, myCar.CurrentSpeed);
あなたがオブジェクトレベルからのIEnumerableの機能を隠すことを好む場合は、

しかし、単に作ります 明示的なインターフェイスの実装を使用します:

IEnumerator IEnumerable.GetEnumerator()
{
  // Return the array object's IEnumerator.
  return carArray.GetEnumerator();
}
一方、

このようにすることで、カジュアルなオブジェクトのユーザーは、ガレージのGetEnumeratorメソッド()メソッドを見つけることができません 必要なときにforeachの構築物は、バックグラウンドでインターフェイスを取得します。

から適合プロC#5.0と.NET Frameworkの4.5

の実装IEnumerableをあなたのクラスはIEnumeratorをオブジェクトを返す意味:

public class People : IEnumerable
{
    IEnumerator IEnumerable.GetEnumerator()
    {
        // return a PeopleEnumerator
    }
}

の実装のIEnumeratorは、あなたのクラスは、反復するためのメソッドとプロパティを返す意味:

public class PeopleEnumerator : IEnumerator
{
    public void Reset()...

    public bool MoveNext()...

    public object Current...
}

それはとにかく違いです。

説明によ似+コードウォークスルー

最初の説明なコードしま添加できるようになっています。

例えば走っている航空会社です。各面を知りたい情報についての旅客のです。基本的にはだいたいできる"トラバース"のです。ついでにフロントシート、その後の平面、乗客情報:ちいから。るaeroplaneできるだけでなく、この場合は:

  1. カウント、
  2. されている場合。

なぜこれらは不要ですか? いう面があります。

この情報は過負荷状態、すべてがわかるまいを聞くことができる乗客の平面の一部の問題から、作り方。

うなカウントを意味するのか。

場合には航空会社は、"カウン"では、この場が必要になり、フライトアテンダントに現在の平面ですが、唯一の仕事はカウントとこのご者数は非常に特定の方法により、

  1. カウンター/フライトアテンダントが必要なの最初の旅客(フロントの皆様がデモの安全をどのようにライフジャケットに関す。
  2. た(乗務員におけ移動"次へ"を通路の最初のポートです。
  3. たはその記録:(i)人物はお席、および(ii)現在のバージンロード。

計数手続き

のキャプテンの航空会社にしたい報告書を各旅客については、その調た。そのお話の最初の席で、飛行-付き添/カウンターその後の報告のキャプテンは、報告があった場合には、カウンターに記憶人の正確な位置が通路側には、継続計数右を行うことを目的とする。

このように、キャプテンは常にできる情報に関する調査報告者について検討していきます。この場合、たいていくつかの提案を行なっているこの人の好きなマンチェスター市、それができると乗客の優遇等

  • カウンターに続までの彼の終わりに達する。

もうこの提携にIEnumerables

  • るenumerableは、収集の国際線ご利用のお客様にはます。の民間航空法-その基本的なルールはすべてのIEnumerablesってください。詳細は航空会社係員のキャプテンのpasseger情報に関しては基本的には'収量の旅客のキャプテンです。のキャプテンでは基本的にはいいたいのは、旅客以外の組み替えたのです。この場合には、上の優遇措置が受けられればフォロマンチェスター市(ウッド!)

    foreach (Passenger passenger in Plane)
    // the airline hostess is now at the front of the plane
    // and slowly making her way towards the back
    // when she get to a particular passenger she gets some information
    // about the passenger and then immediately heads to the cabin
    // to let the captain decide what to do with it
    { // <---------- Note the curly bracket that is here.
        // we are now cockpit of the plane with the captain.
        // the captain wants to give the passenger free 
        // champaign if they support manchester city
        if (passenger.supports_mancestercity())
        {
            passenger.getFreeChampaign();
        } else
        {
            // you get nothing! GOOD DAY SIR!
        }
    } //  <---- Note the curly bracket that is here!
          the hostess has delivered the information 
          to the captain and goes to the next person
          on the plane (if she has not reached the 
          end of the plane)
    

概要

つまり、何かがカウントの場合 カウンター.およびカウンターは基本的には):(i)を覚えて、その場所状態(ii)できる 移動次, (iii)との 現在の 人は彼を扱う。

Enumerableは派手な単語のための"カウント".つまり、enumerableできる'enumerate(ります。

IEnumerableをには、GetEnumeratorメソッドを実装します。呼び出されると、そのメソッドは実装のIEnumerator に戻りますMoveNextメソッドは、リセットと電流ます。

あなたのクラスはIEnumerableを実装したときに

このように、あなたはメソッド(GetEnumeratorメソッド)を呼び出すと、新しいオブジェクトは、あなたがそのようなforeachのように、ループ内で使用することができます(IEnumeratorを)返さ得ることができることを言っている。

の実装IEnumerableをリストのためのIEnumeratorを取得することができます。

のIEnumeratorはyieldキーワードを使用して、リスト内の項目にforeachのスタイルシーケンシャルアクセスを可能にします。

値が返される(例えばJavaの1.4で、)foreachの実装前に、リストを反復処理する方法は、その後、一覧から列挙子を取得する限りでは、リスト中の「次」の項目のためにそれを依頼する

でした次の項目としてnullではありません。 foreachのは、単純に(ロックと同じように、暗黙的に言語機能としてそれを行う)舞台裏モニタクラスを実装します。

私は、彼らがIEnumerableを実装するためのforeachは、リスト上で動作します期待しています。

  • オブジェクトの実施 IEnumerable でその他を訪問した各項目 (査).
  • オブジェクトの実施 IEnumerator のになります。でループを超えるenumerableオブジェクトです。

思いenumerable物としてのリスト、煙突、。

IEnumerableとIEnumerator(およびその汎用カIEnumerable<T> とIEnumerator<T>)ベースのインタフェース 反復子 実装に .Net Frameworkのクラス図書館所蔵.

IEnumerable 最も一般的なインターフェース、まさに多数のコードがあります。これにより、foreachループ、発電機( 利回り やその小さなインターフェースの使用を密に抽象化. IEnumerableよIEnumerator.

IEnumerator, 一方、レベルを下げ繰り返し処理インタフェース。このときの 明示的な反復子 のプログラマーの管理を繰り返します。

IEnumerable

IEnumerableは標準インタフェースを可能にする繰り返し処理を行レーションに対応していますので(実際には、すべての収集も考えることができる今日の実施 IEnumerable).コンパイラを支援できる言語機能など foreach.一般的に行うことが可能です 暗黙的な反復子の実装.

foreachループ

foreach (var value in list)
  Console.WriteLine(value);

と思い foreach ループの主な要因を IEnumerable インタフェース foreach 非常に簡潔構文と非常にわかりやすくできてと比べてクラシック C スタイルをループすの確認が必要となるため種々の変数への参照としています。

利回りをキーワード

と思われる、知られていない特徴と IEnumerable も可能に 発電機のクライアントまで、フルのC# の利用 yield returnyield break 記述です。

IEnumerable<Thing> GetThings() {
   if (isNotReady) yield break;
   while (thereIsMore)
     yield return GetOneMoreThing();
}

抽象化

その他の一般的なシナリオを実際に使用 IEnumerable をばかに抽象化.ですので、微や読み込み専用インタフェースすめなプレーとして IEnumerable (というより リスト など)を行います。そのように自由ですが、変更実施を壊すことなく、クライアントのコードの変更リストへ LinkedList します。

Gotcha

一つの行動を意識することでストリーミングの実装例取得データが一行からデータベースではなく、積載すべての結果をメモリに初) できない 繰り返し処理を実行してから、コレクションの複があります。これに対しメモリ内蔵のような リスト, できる複数回繰り返し処理を実行します。簡単に、ios、androidとmac用にc#、例えば、 は、コード検査 可能な複数の列挙型のIEnumerable.

IEnumerator

IEnumerator、一方では裏面にある IEnumerble-foreach-マジック ます。厳密に言えば、できる明示的な反復子.

var iter = list.GetEnumerator();
while (iter.MoveNext())
    Console.WriteLine(iter.Current);

私の経験 IEnumerator はほとんど使われていませんが共通のシナリオによる詳細な構文は、若干の混乱を意味論(少なくとも私;例えば MoveNext() 値を返すものとない時があります。

使用例IEnumerator

ただ IEnumerator において、特に若干低レベルの図書館および枠組みで提供するようになった IEnumerable インタフェース例えば、データストリーム処理ライブラリ提供するシリーズのオブジェクト foreach ループのももの裏のデータを収集した各種ファイルの流れとserialisations.

クライアントコード

foreach(var item in feed.GetItems())
    Console.WriteLine(item);

図書館

IEnumerable GetItems() {
    return new FeedIterator(_fileNames)
}

class FeedIterator: IEnumerable {
    IEnumerator GetEnumerator() {
        return new FeedExplicitIterator(_stream);
    }
}

class FeedExplicitIterator: IEnumerator {
    DataItem _current;

    bool MoveNext() {
        _current = ReadMoreFromStream();
        return _current != null;           
    }

    DataItem Current() {
        return _current;   
    }
}

本質的IEnumerableを実装するオブジェクトを反復処理することができることを意味します。これは、必ずしもインデックスを作成することはできませんが、あなたがそれらを列挙することができ、特定のリストがあるので、それが配列であることを意味しません。

IEnumeratorは反復を実行するために使用される実際のオブジェクトです。これは、リスト内の次にあるオブジェクトからの移動を制御する。

ほとんどの時間、IEnumerableIEnumeratorforeachループの一部として透過的に使用されます。

違いはIEnumerableとIEnumerator:

  • IEnumerable用IEnumerator内蔵しています。
  • IEnumerableのだが、知する項目オブジェクトです。
  • 私たちがパスIEnumerator他の機能で知って現在の位置の項目オブジェクトです。
  • 私たちがパスIEnumerableコレクション機能で 知らない現在の位置の項目オブジェクトにない項目その実行)

    IEnumerableい方法GetEnumerator()

public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}

IEnumeratorい物件現在、二つの方法でリセットMoveNext(に役立つ知ることの現在位置の項目リスト

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

イテレータパターンの理解はあなたのために参考になります。私は同じことを読んでお勧めします。

イテレータパターン

はハイレベルでイテレータパターンは、任意のタイプのコレクションを反復の標準的な方法を提供することができます。 私たちは、イテレータパターンで3人の参加、実際のコレクション(クライアント)、アグリゲータとイテレータを持っています。集合体はイテレータを返すメソッドを有するインターフェース/抽象クラスです。イテレータは、私たちは、コレクションを反復処理できるようにするメソッドを持つインタフェース/抽象クラスです。

の私たちが最初に心配コレクションを反復処理することができ、コンクリートを生産するためにイテレータを実装する必要がパターンを実現するために(クライアント) その後、コレクション(クライアント)は、上記のイテレータのインスタンスを返すようにアグリゲーターを実装しています。

ここではUML図であります イテレータパターン

だから、基本的にはC#で、IEnumerableをは抽象的集合体であるとのIEnumeratorは抽象イテレータです。 IEnumerableを、所望のタイプののIEnumeratorのインスタンスを作成する責任がある単一のメソッドGetEnumeratorのトピックを有します。リストのようなコレクションはIEnumerableを実装します。

例。 私たちは、文字列のすべての順列を返し、メソッドが

getPermutations(inputString)のインスタンスを返すことメソッドIEnumerable<string>を持っていると仮定します

私たちは以下のような何かができる順列の数をカウントするために。

 int count = 0;
        var permutations = perm.getPermutations(inputString);
        foreach (string permutation in permutations)
        {
            count++;
        }

C#コンパイラは、多かれ少なかれ

に上記に変換します
using (var permutationIterator = perm.getPermutations(input).GetEnumerator())
        {
            while (permutationIterator.MoveNext())
            {
                count++;
            }
        }

ご質問がありましたらお気軽にお問い合わせください。

IEnumerableをはのIEnumeratorを含むボックスです。 IEnumerableをはすべてのコレクションの基本インタフェースです。コレクションがIEnumerableを実装している場合、foreachループを動作させることができます。以下のコードでは、私たち自身の列挙子を持つことのステップを説明します。最初に私たちは、コレクションを作るつもりされているの私たちのクラスを定義できます。

public class Customer
{
    public String Name { get; set; }
    public String City { get; set; }
    public long Mobile { get; set; }
    public double Amount { get; set; }
}

今、私たちは私たちのクラスの顧客のためのコレクションとして動作するクラスを定義します。それはIEnumerableインターフェイスを実装していることに注意してください。そのように、我々は、メソッドGetEnumeratorメソッドを実装する必要があります。これが私たちのカスタム列挙子を返します。

public class CustomerList : IEnumerable
{
    Customer[] customers = new Customer[4];
    public CustomerList()
    {
        customers[0] = new Customer { Name = "Bijay Thapa", City = "LA", Mobile = 9841639665, Amount = 89.45 };
        customers[1] = new Customer { Name = "Jack", City = "NYC", Mobile = 9175869002, Amount = 426.00 };
        customers[2] = new Customer { Name = "Anil min", City = "Kathmandu", Mobile = 9173694005, Amount = 5896.20 };
        customers[3] = new Customer { Name = "Jim sin", City = "Delhi", Mobile = 64214556002, Amount = 596.20 };
    }

    public int Count()
    {
        return customers.Count();
    }
    public Customer this[int index]
    {
        get
        {
            return customers[index];
        }
    }
    public IEnumerator GetEnumerator()
    {
        return customers.GetEnumerator(); // we can do this but we are going to make our own Enumerator
        return new CustomerEnumerator(this);
    }
}

今、私たちは次のように私たち自身のカスタム列挙子を作成しようとしています。そこで、我々は、メソッドMoveNextメソッドを実装する必要があります。

 public class CustomerEnumerator : IEnumerator
    {
        CustomerList coll;
        Customer CurrentCustomer;
        int currentIndex;
        public CustomerEnumerator(CustomerList customerList)
        {
            coll = customerList;
            currentIndex = -1;
        }

        public object Current => CurrentCustomer;

        public bool MoveNext()
        {
            if ((currentIndex++) >= coll.Count() - 1)
                return false;
            else
                CurrentCustomer = coll[currentIndex];
            return true;
        }

        public void Reset()
        {
            // we dont have to implement this method.
        }
    }

今、私たちは以下のように私たちのコレクションの上にforeachループを使用することができます。

    class EnumeratorExample
    {
        static void Main(String[] args)
        {

            CustomerList custList = new CustomerList();
            foreach (Customer cust in custList)
            {
                Console.WriteLine("Customer Name:"+cust.Name + " City Name:" + cust.City + " Mobile Number:" + cust.Amount);
            }
            Console.Read();

        }
    }

マイナー。

として多くの説明が使用"及び"利用foreach'.と思ったのを加えること 国差 こちらの要求にしたがって問題の両方IEnumerable、IEnumerator.

作成した以下のコードサンプルを以下に議論す。

IEnumerable,IEnumerator vs foreach、使用の際は何 の違いは何ですかIEnumeratorとIEnumerable?

査-保存の状態を繰り返し位置と機能通話を繰り返しのEnumerableはできません。

ここでの試験例のコメントす。

専門家に加えてください/正しました。

static void EnumerableVsEnumeratorStateTest()
{
    IList<int> numList = new List<int>();

    numList.Add(1);
    numList.Add(2);
    numList.Add(3);
    numList.Add(4);
    numList.Add(5);
    numList.Add(6);

    Console.WriteLine("Using Enumerator - Remembers the state");
    IterateFrom1to3(numList.GetEnumerator());

    Console.WriteLine("Using Enumerable - Does not Remembers the state");
    IterateFrom1to3Eb(numList);

    Console.WriteLine("Using Enumerable - 2nd functions start from the item 1 in the collection");
}

static void IterateFrom1to3(IEnumerator<int> numColl)
{
    while (numColl.MoveNext())
    {
        Console.WriteLine(numColl.Current.ToString());

        if (numColl.Current > 3)
        {
            // This method called 3 times for 3 items (4,5,6) in the collection. 
            // It remembers the state and displays the continued values.
            IterateFrom3to6(numColl);
        }
    }
}

static void IterateFrom3to6(IEnumerator<int> numColl)
{
    while (numColl.MoveNext())
    {
        Console.WriteLine(numColl.Current.ToString());
    }
}

static void IterateFrom1to3Eb(IEnumerable<int> numColl)
{
    foreach (int num in numColl)
    {
        Console.WriteLine(num.ToString());

        if (num>= 5)
        {
            // The below method invokes for the last 2 items.
            //Since it doesnot persists the state it will displays entire collection 2 times.
            IterateFrom3to6Eb(numColl);
        }
    }
}

static void IterateFrom3to6Eb(IEnumerable<int> numColl)
{
    Console.WriteLine();
    foreach (int num in numColl)
    {
        Console.WriteLine(num.ToString());
    }
}

私はこれらの違いに気づいています:

A。私たちは、さまざまな方法でリストを反復、foreachのは、IEnumeratorをするループのIEnumerableのためにしている間に使用することができます。

B。私たちは別の方法で渡すときのIEnumeratorは、現在のインデックスを思い出すことができます(これは、現在のインデックスで作業を開始)が、IEnumerableを、索引を思い出すことができないと、それは最初にインデックスをリセットします。このビデオ https://www.youtube.com/watch?v=jd3yUjGc9M0する

IEnumerableIEnumerator両方は、C#のインターフェイスである。

IEnumerableGetEnumerator()インタフェースを返す単一メソッドIEnumeratorを定義するインターフェースである。

このはIEnumerableforeach文で使用することができることを実装するコレクションへの読み取り専用アクセスのために働くます。

IEnumeratorは二つの方法、MoveNextResetを持っています。また、Currentというプロパティがあります。

以下では、IEnumerableをとのIEnumeratorの実装を示します。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Enudemo
{

    class Person
    {
        string name = "";
        int roll;

        public Person(string name, int roll)
        {
            this.name = name;
            this.roll = roll;
        }

        public override string ToString()
        {
            return string.Format("Name : " + name + "\t Roll : " + roll);
        }

    }


    class Demo : IEnumerable
    {
        ArrayList list1 = new ArrayList();

        public Demo()
        {
            list1.Add(new Person("Shahriar", 332));
            list1.Add(new Person("Sujon", 333));
            list1.Add(new Person("Sumona", 334));
            list1.Add(new Person("Shakil", 335));
            list1.Add(new Person("Shruti", 336));
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
           return list1.GetEnumerator();
        }
    }



    class Program
    {
        static void Main(string[] args)
        {
            Demo d = new Demo();  // Notice here. it is simple object but for 
                                //IEnumerator you can get the collection data

            foreach (Person X in d)
            {
                Console.WriteLine(X);
            }

            Console.ReadKey();
        }
    }
}
/*
Output : 

Name : Shahriar  Roll : 332
Name : Sujon     Roll : 333
Name : Sumona    Roll : 334
Name : Shakil    Roll : 335
Name : Shruti    Roll : 336
  */
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top