読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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

C#

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



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);
            }
        }
    }
}

ちょっと素敵。