LINQでList<string[]>から検索してインデックスで返すやつ


最近の業務でCSVファイルをあれこれいじくるっていうのをC#で書いてる。

C#自体はなんかJavaみたいで特に問題はなくするする書けるのだけど
LINQで列挙するような奴がすごく便利だとは気づいたけどなかなか難しい。

CSVファイルはVB.NETにあるTextFieldParserを使ってList<string[]>にしているのだけど、
扱ってるファイルはものによってどこに何があるのかというのが違ってくる場合があって
その揺れを吸収してなんとか必要な範囲だけの値を取り出したくこんなものを書いた。

LINQSearchReturnIndex.cs
 var f = new List<string[]>
{
 new string[] {"a","b" }
 new string[] {"c","d" },
 new string[] {"e","f","g" },
 new string[] {"1","g","f" },
 new string[] {"h","i","j" },
 new string[] {"k","l" }
};

 var d = f
.Where(l => l[0] == "e")
.FirstOrDefault()?
.Select((s, i) => new { s, i })
.Where(t => t.s == "f")
.Select(l => new {
  CIndex = l.i,
  RIndex = f
  .Select((a, i) => new { Line = a, ri = i })
  .Where(s => s.Line[0] == "e")
  .FirstOrDefault()?
  .ri
  }
);

 Console.WriteLine($"{d?.Single().RIndex}:{d?.Single().CIndex}");
 Console.ReadKey();

ある文字列から始まる行のどこにもう一つの文字列があるかを調べるもの。
0からはじまるインデックスで返してくれるはず。
C# 6.0から追加された?.演算子も便利。

冗長かなとは思うけどとりあえずこれでなんとかなったので良しとした。
見つかった場所のインデックスを列挙できたりメソッドにしてやれば便利なんだろうけど、
そこまで勉強できてないのでここまで。

すごいつよいひとはもっとわかりやすく書けるのだろうけど自分には限界でした。