Csharp/CSharp Tutorial/Generic/Generic IEnumerator

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

A generic iterator.

<source lang="csharp">using System; using System.Collections.Generic;

class MyClass<T> {

 T[] array; 

 public MyClass(T[] a) { 
   array = a; 
 } 

 public IEnumerator<T> GetEnumerator() { 
   foreach(T obj in array) 
     yield return obj; 
 } 

}

class MainClass {

 public static void Main() { 
   int[] nums = { 4, 3, 6, 4, 7, 9 }; 
   MyClass<int> mc = new MyClass<int>(nums); 

   foreach(int x in mc) 
     Console.Write(x + " "); 

   Console.WriteLine(); 


  bool[] bVals = { true, true, false, true }; 
   MyClass<bool> mc2 = new MyClass<bool>(bVals); 

   foreach(bool b in mc2) 
     Console.Write(b + " "); 

   Console.WriteLine(); 
 } 

}</source>

4 3 6 4 7 9
True True False True

Creating a list from an array

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Text; public class MainClass {

   public static void Main()
   {
       
       List<int> intList = new List<int>(new int[] { 3, 5, 15, 1003, 25 });
   }

}</source>

Generic IEnumerator/IEnumerable

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.Text; class StringEnumerator : IEnumerator<string> {

  string[] Strings; int Position = -1;
  public string Current                         
  {
     get { 
        return Strings[Position]; 
     }
  }
  object IEnumerator.Current                    
  {
     get { 
       return Strings[Position]; 
     }
  }
  public bool MoveNext()                        
  {
     if (Position < Strings.Length - 1)
     { 
       Position++; 
       return true; 
     }
     else
        return false;
  }
  public void Reset()                           
  {
     Position = -1;
  }
  public void Dispose() { }
  public StringEnumerator(string[] strings)      
  {
     Strings = new string[strings.Length];
     for (int i = 0; i < strings.Length; i++)
        Strings[i] = strings[i];
  }

} class MyStrings : IEnumerable<string> {

  string[] Strings = { "AAA", "BBB", "CCC" };
  public IEnumerator<string> GetEnumerator()    
  {
     return new StringEnumerator(Strings);
  }
  IEnumerator IEnumerable.GetEnumerator()       
  {
     return new StringEnumerator(Strings);
  }

} class Program {

  static void Main()
  {
     MyStrings mc = new MyStrings();
     foreach (string st in mc)
        Console.Write("{0}  ", st);
     Console.WriteLine("");
  }

}</source>

AAA  BBB  CCC

IEnumerator<T>

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Text; public class MainClass {

   public static void Main()
   {
       IEnumerable<string> enumerable = new string[] { "A", "B", "C" };
       foreach (string s in enumerable)
           Console.WriteLine(s);
       IEnumerator<string> enumerator = enumerable.GetEnumerator();
       while (enumerator.MoveNext())
       {
           string s = enumerator.Current;
           Console.WriteLine(s);
       }
   }

}</source>

A
B
C
A
B
C

Template method

<source lang="csharp">/*Quote from: Book Accelerated C# 2005

   * By Trey Nash
   * ISBN: 1-59059-717-6
   * 432 pp.
   * Published: Aug 2006
   * Price: $39.99
  • /

using System; using System.Collections.Generic; public class MyContainer<T> : IEnumerable<T> {

   public void Add( T item ) {
       impl.Add( item );
   }
   // Converter<TInput, TOutput> is a new delegate type introduced
   // in the .NET Framework that can be wired up to a method that
   // knows how to convert the TInput type into a TOutput type.
   public void Add<R>( MyContainer<R> otherContainer,Converter<R, T> converter ) {
       foreach( R item in otherContainer ) {
           impl.Add( converter(item) );
       }
   }
   public IEnumerator<T> GetEnumerator() {
       foreach( T item in impl ) {
           yield return item;
       }
   }
   System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
       return GetEnumerator();
   }
   private List<T> impl = new List<T>();

} public class EntryPoint {

   static void Main() {
       MyContainer<long> lContainer = new MyContainer<long>();
       MyContainer<int> iContainer = new MyContainer<int>();
       lContainer.Add( 1 );
       lContainer.Add( 2 );
       iContainer.Add( 3 );
       iContainer.Add( 4 );
       lContainer.Add( iContainer,
                       EntryPoint.IntToLongConverter );
       foreach( long l in lContainer ) {
           Console.WriteLine( l );
       }
   }
   static long IntToLongConverter( int i ) {
       return i;
   }

}</source>

1
2
3
4