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

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

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

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

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

Copy
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;と変数を外に書かなければいけないので、ちょっと見映えも悪いし、無駄な感じがしますよね・・・。

Copy
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 }が重複しているし、いざ書こうと思うと思いだせなくて毎回調べてしまいそう・・・・。

拡張メソッド

Copy
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#】拡張メソッド まとめ」のページをどうぞ。

使い方

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

foreachは、nullチェックをしないと ’System.NullReferenceException’の例外が発生するんですよね・・・。 そこで、拡張メソッドを使って簡単回避する方法をご紹介します。 […]

C# foreach null list【C# 拡張メソッド】 foreach null listのチェック
関連記事

メソッドの戻り値がListで結果によってnullだったり、空だったりする場合、 その判定のソースコードってけっこう長かったりします・・・・。 そこで、拡張メソッドを使って簡単解決する方法をご紹介します。 […]

C# list 空【C# 拡張メソッド】 Listのnull・空チェック
関連記事

拡張メソッドは、非常に便利です。 既存のクラスへのメソッドを追加して、インスタンスメソッドのように呼び出しができます。 元々クラスに存在したメソッドのように使えるので、それまで複数ステップを使って書いてい[…]

C# 拡張メソッド 【C#】拡張メソッド まとめ

\ 転職を本気で考えるなら /

  • 3つの有名スクールを現役エンジニアの視点で厳選!
  • あなたに合ったおすすめのスクールを紹介!

TECH CAMP エンジニア転職」…最短10週間で転職ができる年齢無制限のスクール!

TechAcademy Pro」…オンラインで全て完結のコスパ最強スクール!

DMM WEBCAMP」…給付金の対象講座もある実力派スクール!

参考サイト

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