【C#】foreach回す時にindexも欲しいんだが!?

はじめに

私は基本的にArrayではなくListを使う派で、かつDictionaryもよく使うのでループは基本的にforではなくforeachを使いたい人です。

しかし、foreachには欠点があり、ループ内でindexを使いたい場合に別の変数を定義して自分でカウントしないといけません。

これがぶっちゃけ面倒。

なので、面倒くさがりでも使いやすいようにしてみました。

実装例

下記をどこか好きな場所に定義します。

    public static class EnumerableExtensions
    {
        // インデックス付きの拡張メソッド
        public static IEnumerable<(T item, int index)> WithIndex<T>(this IEnumerable<T> source)
        {
            return source.Select((item, index) => (item, index));
        }
    }

使い方

元々こう書いていたものが

// 従来のforeachの場合
var fruits = new[] { "りんご", "バナナ", "みかん" };

int i = 0;
foreach (var fruit in fruits)
{
    Console.WriteLine($"インデックス{i}: {fruit}");
    i++;
}

こう書けるようになります。

// WithIndexを使った例
var fruits = new[] { "りんご", "バナナ", "みかん" };

// WithIndexを使用した場合
foreach (var (fruit, index) in fruits.WithIndex())
{
    Console.WriteLine($"インデックス{index}: {fruit}");
}

ループを回す側に.WithIndex()を追加して、一時変数をvar (fruit, index)というタプルを使用して受け取ります。

さいごに

WithIndexの()も取りたいところですが、C#の仕様上現状は難しそうなので、個人的には一旦この形かなぁと思っています。

もっと良い書き方があればぜひ教えて下さい!

最後までお読みいただき、ありがとうございます!
誰かの役に立てば幸いです。

コメント

タイトルとURLをコピーしました