LoginSignup
8
8

More than 5 years have passed since last update.

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

Posted at

最近の業務で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から追加された?.演算子も便利。

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

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

8
8
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8