C#の`foreach`ループはコレクションを反復処理する便利な方法ですが、現在の反復のインデックスを本質的に提供しません。要素とそのインデックスの両方が必要な場合、これは不便です。この記事では、`foreach`のような反復処理内でインデックスを取得する2つの効果的な方法について説明します。
目次
LINQのSelect()
メソッドの使用
LINQのSelect()
メソッドは、要素とそのインデックスの両方を取得する簡潔な方法を提供します。元のコレクションを、各要素がそのインデックスとペアになった新しいシーケンスに変換します。
using System;
using System.Collections.Generic;
using System.Linq;
public class ForeachIndexExample
{
public static void Main(string[] args)
{
List<string> names = new List<string>() { "Alice", "Bob", "Charlie", "David" };
// Select()を使用してインデックスと要素を取得
var indexedNames = names.Select((name, index) => new { Name = name, Index = index });
// インデックス付きシーケンスを反復処理
foreach (var item in indexedNames)
{
Console.WriteLine($"Name: {item.Name}, Index: {item.Index}");
}
}
}
このコードは、名前とそのインデックスの両方を含む新しい匿名型を作成します。その後、`foreach`ループはこの新しいシーケンスを反復処理し、両方の情報へのアクセスを提供します。このアプローチは可読性が高く、任意のサイズの集合でうまく機能します。
標準的なfor
ループの使用
特に大規模なコレクションでは、パフォーマンスを向上させるために、標準的な`for`ループがより直接的なアプローチを提供します。これにより、新しいシーケンスを作成するオーバーヘッドを回避できます。
using System;
using System.Collections.Generic;
public class ForeachIndexExample
{
public static void Main(string[] args)
{
List<string> names = new List<string>() { "Alice", "Bob", "Charlie", "David" };
// インデックス付きforループを使用
for (int index = 0; index < names.Count; index++)
{
string name = names[index];
Console.WriteLine($"Name: {name}, Index: {index}");
}
}
}
この方法は、インデックスを使用して要素に直接アクセスします。`foreach`ループは使用しませんが、大規模なデータセットに対してより効率的なソリューションを提供します。
これらの方法の選択は、優先順位によって異なります。Select()
メソッドは可読性を提供する一方で、for
ループは大規模なコレクションに対してより優れたパフォーマンスを提供します。データのサイズと可読性の重要性を考慮して選択してください。