int[] ia = { ... };
// 偶数だけ取り出す
foreach ( int item in
new SelectEnumerable<int>(ia, delegate(int n) { return n % 2 == 0;}) ) {
Console.WriteLine(item); // 取り出す条件を delegate で与える
}
↓もーヤケクソ
using System;
using System.Collections;
using System.Collections.Generic;
namespace Wankuma.Collections.Generic {
struct SelectEnumerator<T> : IEnumerator<T> {
private IEnumerator<T> enumerator_;
private Predicate<T> predicate_;
public SelectEnumerator(IEnumerator<T> enumerator, Predicate<T> predicate)
{ enumerator_ = enumerator; predicate_ = predicate; }
public T Current
{ get { return enumerator_.Current; } }
object IEnumerator.Current
{ get { return enumerator_.Current; } }
public void Dispose()
{ enumerator_.Dispose(); }
public bool MoveNext()
{ while ( enumerator_.MoveNext() ) {
if ( predicate_(enumerator_.Current) ) return true;
}
return false; }
public void Reset()
{ enumerator_.Reset(); }
}
public class SelectEnumerable<T> : IEnumerable<T> {
private IEnumerable<T> enumerable_;
private Predicate<T> predicate_;
public SelectEnumerable(IEnumerable<T> enumerable, Predicate<T> predicate)
{ enumerable_ = enumerable; predicate_ = predicate; }
public IEnumerator<T> GetEnumerator()
{ return new SelectEnumerator<T>(enumerable_.GetEnumerator(), predicate_); }
IEnumerator IEnumerable.GetEnumerator()
{ return new SelectEnumerator<T>(enumerable_.GetEnumerator(), predicate_); }
}
}