汎用IndexOf

IEnumerable汎用のIndexOfがないので書いた。
どこにないかというと「The .NET Standard Query Operators May 2006」やSequence.csに。なんでないんだ、あり得ないでしょ>MSさん
追加すべきと報告したいけど、どこに言えばいいんだろ。見落としだったらはずかしいけどw
C#2.0で書いた。3.0なら this IEnumerable source が吉。

public static int IndexOf<T>( IEnumerable<T> source, T target )
{
	int index = 0;
	foreach ( T item in source )
	{
		if ( EqualityComparer<T>.Default.Equals( item, target ) )
			return index;
		index++;
	}
	return -1;
}

これがあれば、多次元配列の一部だろうがなんだろうがイテレータがあれば(または用意すれば)、手続き型のプログラムが見やすい宣言型に変わります。パッと見で理解できる、保守性のよさがいい感じ。

こんなのが、

for ( int j = 0; j < MaxWidth; j++ )
{
	if ( 0 == this._numbers[ j, i ] )
	{
		this.SetValue( i, j, this._bitColumnUnusedNumber[ i ] );
		break;
	}
}

こうなります。

int pos = IndexOf( this.ColumnIterator( i ), 0 );
this.SetValue( i, pos, this._bitColumnUnusedNumber[ i ] );

宣言型でいきまっしょい。

ん、indexがintの範囲を超えて一周したらマズイか。それで追加するのをためらってるのかなぁ。む〜。そこはユーザ責任で。
数値型ってのは手軽に見えて、実はコンピュータの限界が露骨に見える面倒くさいドロドロした部分だよなぁ。