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 }
新しいものを生み出している匿名オブジェクト。
ValueTuple
C# 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.
}