LINQの得手不得手?
シーケンス中の値が0の要素のインデックス番号をすべて求めるコード。
普通の書き方。
int[] numbers = { 9, 0, 7, 6, 0, 4, 0, 2, 1 }; List<int> blankIndeces = new List<int>(); int count = 0; foreach ( int value in numbers ) { if ( value == 0 ) blankIndeces.Add( count ); count++; }
int[] numbers = { 9, 0, 7, 6, 0, 4, 0, 2, 1 }; var blankIndices = numbers. Select( (n, index) => new { Index = index, Value = n } ). Where( pair => pair.Value == 0 ). Select( pair => pair.Index );
LINQ版はまどろっこしい。こんなコードになるんなら、わざわざLINQで書かないし。Selectが2つってのもキモイかも。もっとスマートに書けないでしょうか?
id:siokoshou:20070416#p2のnsharpさんのコメントも似たようなコード。
要素が元々持っていない値を扱うのが苦手なのかな。indexのようにSelectやWhereが供給してくれる値であっても、なんだかまだるっこしい感じ。
データベースに詳しくないのでわからないけど、きっとSQLのSELECTも同じような傾向があるんだろうなぁ。