foreach ループの現在の反復のインデックスを取得するにはどうすればよいでしょうか? 質問する

foreach ループの現在の反復のインデックスを取得するにはどうすればよいでしょうか? 質問する

C# で、foreach ループの現在の反復を表す値を取得するために、私が遭遇したことのない珍しい言語構造 (最近学んだものや Stack Overflow で見つけたものなど) はありますか?

たとえば、私は現在、状況に応じて次のようなことを行っています。

int i = 0;
foreach (Object o in collection)
{
    // ...
    i++;
}

ベストアンサー1

イアン・マーサーはこれに似た解決策を投稿しましたPhil Haack のブログ:

foreach (var item in Model.Select((value, i) => new { i, value }))
{
    var value = item.value;
    var index = item.i;
}

これは、アイテム(item.value)とそのインデックス(item.i)を取得します。LINQの過負荷Select:

関数の 2 番目のパラメータ (Select 内) は、ソース要素のインデックスを表します。

new { i, value }新しいものを生み出している匿名オブジェクト

ValueTupleC# 7.0 以降を使用している場合は、以下を使用することでヒープ割り当てを回避できます。

foreach (var item in Model.Select((value, i) => ( value, i )))
{
    var value = item.value;
    var index = item.i;
}

item.自動構造化分解を使用して、を削除することもできます。

foreach (var (value, i) in Model.Select((value, i) => ( value, i )))
{
    // Access `value` and `i` directly here.
}

おすすめ記事