【LINQ】データ操作前のインデックスを保持する
LINQでデータを操作してインデックスを取得すると、操作後のインデックスが取得されてしまう。
例えば、操作前の2番目の要素を取得しても、それを出力する時にそれが何番目だったかはわからない。
操作前のインデックスを保持したい場合は、データ操作をする前に、操作前のインデックスを保持したオブジェクトに変換する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
static void Main(string[] args) { var str = "あ,い,う,え,お"; var obj = str?.Split(',').Select((s, i) => new { s, i }).Where((s, i) => i % 2 == 0).Select(s => new { s.s, s.i }); WriteString(obj.Select((o, i) => $"i ={i}, o.s = {o.s}, o.i = {o.i}"), "i = 抽出後のインデックス, o.s = 内容, o.i = 抽出前のインデックス"); /*出力内容: i = 抽出後のインデックス, o.s = 内容, o.i = 抽出前のインデックス "i =0, o.s = あ, o.i = 0" "i =1, o.s = う, o.i = 2" "i =2, o.s = お, o.i = 4"*/ } //出力用のメソッド private static void WriteString(IEnumerable<string> strings, string header) { var content = string.Join("\n", strings.Select(s => $"\"{s}\"")); Console.WriteLine($"{header}\n{content}"); } |