ForEachAudit を全面改訂。
string[] sa = { .... }
foreach ( CountValuePair<string> item in new CountEnumerable<string>(sa) ) {
// Count:0基点の通番 Value:列挙値
Console.WriteLine("sa[{0}] = {1}", item.Count, item.Value);
}
ソースはこんな↓
using System;
using System.Collections;
using System.Collections.Generic;
namespace Wankuma.Collections.Generic {
public struct CountValuePair<T> {
public int Count;
public T Value;
}
class CountEnumerator<T> : IEnumerator<CountValuePair<T>> {
private CountValuePair<T> pair_ = new CountValuePair<T>();
private IEnumerator<T> enumerator_;
public CountEnumerator(IEnumerator<T> enumerator)
{ enumerator_ = enumerator; Reset(); }
public CountValuePair<T> Current
{ get { pair_.Value = enumerator_.Current; return pair_; } }
object IEnumerator.Current
{ get { pair_.Value = enumerator_.Current; return pair_; } }
public bool MoveNext()
{ ++pair_.Count; return enumerator_.MoveNext(); }
public void Reset()
{ pair_.Count = -1; enumerator_.Reset(); }
public void Dispose()
{ enumerator_.Dispose(); }
}
public class CountEnumerable<T> : IEnumerable<CountValuePair<T>> {
private IEnumerable<T> enumerable_;
public CountEnumerable(IEnumerable<T> enumerable)
{ enumerable_ = enumerable; }
public IEnumerator<CountValuePair<T>> GetEnumerator()
{ return new CountEnumerator<T>(enumerable_.GetEnumerator()); }
IEnumerator IEnumerable.GetEnumerator()
{ return new CountEnumerator<T>(enumerable_.GetEnumerator()); }
}
}
一連のこのシリーズ、Orient収録分も一緒に「わんくまライブラリ」として公開しよかと
画策しております。