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版を入れなかったのはなぜだろう。