Материал из .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