Csharp/CSharp Tutorial/Generic/Generic IEnumerator
Содержание
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