プログラミングとかブログ

Unity/C#/SRPGStudio/RPGツクールMVの情報とかその他気になったことを調べて書きます。

【C#】LINQで要素のインデックス(番号)を取得する

{0,0,1,0,1}からインデックス1以降で要素の値が0のインデックス(1と3)を取得します。

IEnumerable<int> hoge = new[] { 0, 0, 1, 0, 1 };

var indeces = hoge
    //要素とそのインデックスを匿名クラスのリストに射影
    .Select((p, i) => new { Content = p, Index = i })
    //上記リストをフィルタリング
    .Where(ano => ano.Content == 0 && ano.Index >= 1)
    //インデックスだけのリストを取得
    .Select(ano => ano.Index);

indeces.ToList().ForEach(s => Console.WriteLine(s));

//結果
//1
//3

解説

.Select((p, i) => new { Content = p, Index = i })

Selectメソッドのオーバーロードを使って、要素とそのインデックスをプロパティにした匿名クラスのリストを作っています。
要するに下図のようなリストになります。
f:id:shirakamisauto:20160626142350p:plain

.Where(ano => ano.Content==0 && ano.Index>=1)

上記リストをフィルタリングします。
ここでは要素の値が0で、要素のインデックスが1以上の匿名クラスのリストが作られます。
f:id:shirakamisauto:20160626142354p:plain

.Select(ano => ano.Index)

フィルタリングしたリストをインデックスだけのリストに変換します。
これで1と3が取れました。
f:id:shirakamisauto:20160626142357p:plain



参考
プログラミングな日々: LINQの重箱の隅