汎用IndexOf
IEnumerable
どこにないかというと「The .NET Standard Query Operators May 2006」やSequence.csに。なんでないんだ、あり得ないでしょ>MSさん
追加すべきと報告したいけど、どこに言えばいいんだろ。見落としだったらはずかしいけどw
C#2.0で書いた。3.0なら this IEnumerable
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の範囲を超えて一周したらマズイか。それで追加するのをためらってるのかなぁ。む〜。そこはユーザ責任で。
数値型ってのは手軽に見えて、実はコンピュータの限界が露骨に見える面倒くさいドロドロした部分だよなぁ。