かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

foreachでループのindexを知る方法

2018/01/05 追記

blog.okazuki.jp

本文

久しぶりにおぉ〜〜!と思ったのでメモです。


foreachで今何回目のループなのかを知りたいという願望は誰もが一度は胸に抱いたことがあると思います。
そういうときに、一時変数を準備するよりエレガントちっくな方法です。

ただ、一般的な書き方として認知されていない可能性は否めないので人がコードを見たときに何をしてるんだろう?と思ってしまうかもしれません。ここらへん、時間が解決してくれるかな。

やり方というのは、LINQのSelectメソッドを使う方法です。Selectメソッドには、なんと、インデックスを渡してくれるオーバーロードがあるので、そこで匿名型を使ってインデックスと値のペアを作ってやるという仕組みになります。
コードに書くと以下のような感じ。

using System;
using System.Linq;

namespace CountForeach
{
    class Program
    {
        static void Main(string[] args)
        {
            // テスト用配列
            var array = new[] { "aaa", "bbb", "ccc" };

            // Selectメソッドで値をインデックスのペアを作ってそれをforeachでまわす
            foreach (var item in array.Select((v, i) => new { v, i }))
            {
                // 匿名型から値とインデックスを取り出して使える
                Console.WriteLine("value = {0}, index = {1}", item.v, item.i);
            }
        }
    }
}

ちょっと素敵。