【C# 拡張メソッド】 foreach index付き

foreachで、インデックス付きで使いたいことが時々あるんですよね。
でも使おうと思うと忘れていたり、書いてみるとけっこう面倒だったり・・・・。

そこで、拡張メソッドを使って簡単解決する方法をご紹介します。

目次

【C# 拡張メソッド】 foreach index付き

拡張メソッド使わないソースコード例

public class Program
{
    public void Main()
    {
        // ①変数を使う方法
        var i = 0;
        foreach (var item in items)
        {
            Console.WriteLine($"index: {i}, value: {item}");
            i++;
        }       
    }
}

foreachの前にvar i = 0;と変数を外に書かなければいけないので、ちょっと見映えも悪いし、無駄な感じがしますよね・・・。

public class Program
{
    public void Main()
    {
        // ②Selectのオーバーロードを使う方法
        foreach (var x in items.Select((item, index) => new { item, index }))
        {
            Console.WriteLine($"index: {x.index}, value: {x.item}");
        }
    }
}

Selectの中の(item, index) => new { item, index }が重複しているし、いざ書こうと思うと思いだせなくて毎回調べてしまいそう・・・・。

拡張メソッド

public static class IEnumerableExtension
{
    public static IEnumerable<(T item, int index)> Indexed<T>(this IEnumerable<T> source)
    {
        if (source == null) throw new ArgumentNullException(nameof(source));

        IEnumerable<(T item, int index)> impl()
        {
            var i = 0;
            foreach (var item in source)
            {
                yield return (item, i);
                ++i;
            }
        }
        return impl();
    }
}

他にも便利な拡張メソッドを知りたい方は「【C#】拡張メソッド まとめ」のページをどうぞ。

使い方

public class Program
{
    foreach (var (item, index) in items.Indexed())
    {
        Console.WriteLine($"index: {index}, value: {item}");
    }
}

最後まで読んでくれてありがとうございます。
それでは、また。

こちらの記事も読まれています!

参考サイト

++C++; // 未確認飛行 C:小ネタ インデックス付き foreach
Gist: index付きforeach

よかったらシェアしてね!
目次
閉じる