Csharp/CSharp Tutorial/Generic/Generic IEnumerator

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

A generic iterator.

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(); 
  } 
}
4 3 6 4 7 9
True True False True

Creating a list from an array

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 });
    }
}

Generic IEnumerator/IEnumerable

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("");
   }
}
AAA  BBB  CCC

IEnumerator<T>

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);
        }
    }
}
A
B
C
A
B
C

Template method

/*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;
    }
}
1
2
3
4