Tento článek byl přeložený strojově. Pokud chcete zobrazit článek v angličtině, zaškrtněte políčko Angličtina. Anglickou verzi článku můžete také zobrazit v místním okně přesunutím ukazatele myši nad text.
Překlad
Angličtina

Metoda CollectionBase.GetEnumerator ()

.NET Framework (current version)
 

Publikováno: červenec 2016

Vrátí enumerátor, který iteruje CollectionBase instance.

Obor názvů:   System.Collections
Sestavení:  mscorlib (v mscorlib.dll)

public IEnumerator GetEnumerator()

Návratová hodnota

Type: System.Collections.IEnumerator

IEnumerator Pro CollectionBase instance.

[Visual Basic C#]

foreach Příkaz jazyka C# (for each v jazyce Visual Basic) maskuje složitost čítačů. Proto pomocí foreach doporučujeme místo přímé manipulace s enumerátorem.

Enumerátory lze použít ke čtení dat v kolekci, ale nelze použít k úpravě zdrojové kolekce.

Zpočátku enumerátor je umístěn před první prvek v kolekci. Reset také přesune čítač zpět na tuto pozici. Na toto umístění, volání Current vyvolá výjimku. Proto je třeba zavolat MoveNext pro přechod čítače na první element kolekce před čtením hodnoty Current.

Current vrátí stejný objekt, dokud buď MoveNext nebo Reset je volána. MoveNext Nastaví Current na další prvek.

Pokud MoveNext předá konec kolekce, enumerátor je umístěn za poslední prvek v kolekci a MoveNext vrátí false. Pokud je enumerátor v této pozici, následná volání MoveNext rovněž vracejí false. Pokud poslední volání metody k MoveNext vrátil false, volání Current vyvolá výjimku. Chcete-li nastavit Current na první element kolekce znovu lze volat Reset následované MoveNext.

Čítač zůstává platný tak dlouho, dokud kolekce zůstane beze změny. Pokud jsou provedeny změny do kolekce, například přidáním, úpravou nebo odstranění prvků, enumerátor je nevratně zneplatněna a další volání MoveNext nebo Reset vyvolá InvalidOperationException. Je-li kolekce změněno mezi MoveNext a Current, Current vrátí prvek, který je nastaven na hodnotu, i v případě, že čítač již zneplatněna.

Čítač nemá výhradní přístup ke kolekci. Proto výčet prostřednictvím kolekce není vnitřně bezpečné procedura vlákna. I když kolekce synchronizována, jiných vláken upravovat kolekce, což způsobí, že čítač vyvolá výjimku. Chcete-li zaručit zabezpečení vlákna během výčtu, můžete zamknout kolekci během celého výčtu nebo zachycovat výjimky vzniklé v důsledku změn prováděných ostatními vlákny.

Zatímco GetEnumerator Metoda není viditelná klientům modelu COM ve výchozím nastavení, dědění CollectionBase Třída může vystavit a může způsobit nežádoucí chování v klientům modelu COM.

Tato metoda je operace O(1).

Následující příklad kódu implementuje CollectionBase tříd a že implementace používá k vytvoření kolekce Int16 objekty.

using System;
using System.Collections;

public class Int16Collection : CollectionBase  {

   public Int16 this[ int index ]  {
      get  {
         return( (Int16) List[index] );
      }
      set  {
         List[index] = value;
      }
   }

   public int Add( Int16 value )  {
      return( List.Add( value ) );
   }

   public int IndexOf( Int16 value )  {
      return( List.IndexOf( value ) );
   }

   public void Insert( int index, Int16 value )  {
      List.Insert( index, value );
   }

   public void Remove( Int16 value )  {
      List.Remove( value );
   }

   public bool Contains( Int16 value )  {
      // If value is not of type Int16, this will return false.
      return( List.Contains( value ) );
   }

   protected override void OnInsert( int index, Object value )  {
      // Insert additional code to be run only when inserting values.
   }

   protected override void OnRemove( int index, Object value )  {
      // Insert additional code to be run only when removing values.
   }

   protected override void OnSet( int index, Object oldValue, Object newValue )  {
      // Insert additional code to be run only when setting values.
   }

   protected override void OnValidate( Object value )  {
      if ( value.GetType() != typeof(System.Int16) )
         throw new ArgumentException( "value must be of type Int16.", "value" );
   }

}


public class SamplesCollectionBase  {

   public static void Main()  {

      // Create and initialize a new CollectionBase.
      Int16Collection myI16 = new Int16Collection();

      // Add elements to the collection.
      myI16.Add( (Int16) 1 );
      myI16.Add( (Int16) 2 );
      myI16.Add( (Int16) 3 );
      myI16.Add( (Int16) 5 );
      myI16.Add( (Int16) 7 );

      // Display the contents of the collection using foreach. This is the preferred method.
      Console.WriteLine( "Contents of the collection (using foreach):" );
      PrintValues1( myI16 );

      // Display the contents of the collection using the enumerator.
      Console.WriteLine( "Contents of the collection (using enumerator):" );
      PrintValues2( myI16 );

      // Display the contents of the collection using the Count property and the Item property.
      Console.WriteLine( "Initial contents of the collection (using Count and Item):" );
      PrintIndexAndValues( myI16 );

      // Search the collection with Contains and IndexOf.
      Console.WriteLine( "Contains 3: {0}", myI16.Contains( 3 ) );
      Console.WriteLine( "2 is at index {0}.", myI16.IndexOf( 2 ) );
      Console.WriteLine();

      // Insert an element into the collection at index 3.
      myI16.Insert( 3, (Int16) 13 );
      Console.WriteLine( "Contents of the collection after inserting at index 3:" );
      PrintIndexAndValues( myI16 );

      // Get and set an element using the index.
      myI16[4] = 123;
      Console.WriteLine( "Contents of the collection after setting the element at index 4 to 123:" );
      PrintIndexAndValues( myI16 );

      // Remove an element from the collection.
      myI16.Remove( (Int16) 2 );

      // Display the contents of the collection using the Count property and the Item property.
      Console.WriteLine( "Contents of the collection after removing the element 2:" );
      PrintIndexAndValues( myI16 );

   }

   // Uses the Count property and the Item property.
   public static void PrintIndexAndValues( Int16Collection myCol )  {
      for ( int i = 0; i < myCol.Count; i++ )
         Console.WriteLine( "   [{0}]:   {1}", i, myCol[i] );
      Console.WriteLine();
   }

   // Uses the foreach statement which hides the complexity of the enumerator.
   // NOTE: The foreach statement is the preferred way of enumerating the contents of a collection.
   public static void PrintValues1( Int16Collection myCol )  {
      foreach ( Int16 i16 in myCol )
         Console.WriteLine( "   {0}", i16 );
      Console.WriteLine();
   }

   // Uses the enumerator. 
   // NOTE: The foreach statement is the preferred way of enumerating the contents of a collection.
   public static void PrintValues2( Int16Collection myCol )  {
      System.Collections.IEnumerator myEnumerator = myCol.GetEnumerator();
      while ( myEnumerator.MoveNext() )
         Console.WriteLine( "   {0}", myEnumerator.Current );
      Console.WriteLine();
   }
}


/* 
This code produces the following output.

Contents of the collection (using foreach):
   1
   2
   3
   5
   7

Contents of the collection (using enumerator):
   1
   2
   3
   5
   7

Initial contents of the collection (using Count and Item):
   [0]:   1
   [1]:   2
   [2]:   3
   [3]:   5
   [4]:   7

Contains 3: True
2 is at index 1.

Contents of the collection after inserting at index 3:
   [0]:   1
   [1]:   2
   [2]:   3
   [3]:   13
   [4]:   5
   [5]:   7

Contents of the collection after setting the element at index 4 to 123:
   [0]:   1
   [1]:   2
   [2]:   3
   [3]:   13
   [4]:   123
   [5]:   7

Contents of the collection after removing the element 2:
   [0]:   1
   [1]:   3
   [2]:   13
   [3]:   123
   [4]:   7

*/

Univerzální platforma Windows
K dispozici od 10
.NET Framework
K dispozici od 1.1
Zpět na začátek
Zobrazit: