foreach
foreach でindexが欲しいときなど。
/// <summary>ペア</summary> public struct Pair<T, U> { /// <summary>要素1</summary> public T First; /// <summary>要素2</summary> public U Second; /// <summary>コンストラクタ</summary> public Pair(T t) { First = t; Second = default(U); } /// <summary>コンストラクタ</summary> public Pair(T t, U u) { First = t; Second = u; } /// <summary>等値演算</summary> public override bool Equals(object obj) { Pair<T, U> pr = (Pair<T, U>)obj; return First.Equals(pr.First) && Second.Equals(pr.Second); } /// <summary>ハッシュコード</summary> public override int GetHashCode() { return First.GetHashCode() ^ Second.GetHashCode(); } /// <summary>文字列化</summary> public override string ToString() { return First.ToString() + ", " + Second.ToString(); } } /// <summary>トリプレット</summary> public struct Triplet<T, U, V> { /// <summary>要素1</summary> public T First; /// <summary>要素2</summary> public U Second; /// <summary>要素3</summary> public V Third; /// <summary>コンストラクタ</summary> public Triplet(T t) { First = t; Second = default(U); Third = default(V); } /// <summary>コンストラクタ</summary> public Triplet(T t, U u) { First = t; Second = u; Third = default(V); } /// <summary>コンストラクタ</summary> public Triplet(T t, U u, V v) { First = t; Second = u; Third = v; } /// <summary>等値演算</summary> public override bool Equals(object obj) { Triplet<T, U, V> pr = (Triplet<T, U, V>)obj; return First.Equals(pr.First) && Second.Equals(pr.Second) && Third.Equals(pr.Third); } /// <summary>ハッシュコード</summary> public override int GetHashCode() { return First.GetHashCode() ^ Second.GetHashCode() ^ Third.GetHashCode(); } /// <summary>文字列化</summary> public override string ToString() { return First.ToString() + ", " + Second.ToString() + ", " + Third.ToString(); } } public class PairList<T> : IEnumerable { private IEnumerable lst; public PairList(IEnumerable lst0) {lst = lst0;} public IEnumerator GetEnumerator() { int i = -1; foreach (T t in lst) yield return new Pair<int, T>(++i, t); } } class Program { static void Main(string[] args) { List<string> l = new List<string>(new string[]{"a", "b", "c" }); foreach (Pair<int, string> pr in new PairList<string>(l)) Console.WriteLine("{0} {1}", pr.first, pr.second); } }
1.0からSystem.Web.UI.Pairがあるとは知らなかった。2.0でgenerics版を入れなかったのはなぜだろう。