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}");
}
}
最後まで読んでくれてありがとうございます。
それでは、また。