C# での辞書型 (Dictionary) の反復処理
辞書型とは何か?
C# の Dictionary<TKey, TValue>
は、キーと値のペアを格納するコレクションです。キーはユニークで、値を取得するために使用されます。
foreach ループによる反復
辞書全体を反復処理する最も一般的な方法は foreach
ループです。
Dictionary<string, int> ages = new Dictionary<string, int>();
ages.Add("Alice", 30);
ages.Add("Bob", 25);
ages.Add("Charlie", 35);
foreach (KeyValuePair<string, int> item in ages)
{
Console.WriteLine($"{item.Key} is {item.Value} years old.");
}
このコードでは、KeyValuePair<string, int>
型の item
が各反復で作成され、キーと値にアクセスできます。
キーのみの反復
キーのみを反復処理したい場合は、Keys
プロパティを使用します。
foreach (string key in ages.Keys)
{
Console.WriteLine(key);
}
foreach (int value in ages.Values)
{
Console.WriteLine(value);
}
インデックスによるアクセス
キーを使用して直接値にアクセスすることもできます。
string name = "Alice";
int age = ages[name];
Console.WriteLine($"{name} is {age} years old.");
注意点
- 辞書のキーはユニークであるため、同じキーを複数回追加することはできません。
- 辞書の順序は保証されません。特定の順序が必要な場合は、別のデータ構造を使用してください。
日本語訳
C# の辞書型は、キーと値のペアを格納するコレクションです。キーはユニークで、値を取得するために使用されます。
辞書全体を反復処理するには、foreach
ループが便利です。各反復で、キーと値のペアが KeyValuePair
として取得できます。キーのみ、または値のみを反復処理することもできます。また、キーを使用して直接値にアクセスすることも可能です。
注意点は、キーの重複ができないことと、辞書の順序が保証されないことです。
C# 辞書型の反復処理の解説とコード例
辞書型 (Dictionary) とは?
C# の Dictionary<TKey, TValue>
は、キーと値のペアを格納するコレクションです。キーはユニークで、値を取得するために使用されます。例えば、人の名前(キー)と年齢(値)のペアを格納することができます。
// 人の名前と年齢を格納する辞書
Dictionary<string, int> ages = new Dictionary<string, int>();
ages.Add("Alice", 30);
ages.Add("Bob", 25);
ages.Add("Charlie", 35);
// 辞書を反復処理
foreach (KeyValuePair<string, int> item in ages)
{
Console.WriteLine($"{item.Key}さんは{item.Value}歳です。");
}
- KeyValuePair<string, int> item: 各反復で、キーと値のペアが
item
に格納されます。 - item.Key: キー(名前)にアクセスします。
- item.Value: 値(年齢)にアクセスします。
foreach (string key in ages.Keys)
{
Console.WriteLine(key);
}
foreach (int value in ages.Values)
{
Console.WriteLine(value);
}
string name = "Alice";
int age = ages[name];
Console.WriteLine($"{name}さんは{age}歳です。");
- 辞書の順序: 辞書の要素の順番は保証されません。
- パフォーマンス:
foreach
ループは、辞書の要素をすべて走査するため、要素数が多い場合はパフォーマンスに影響を与える可能性があります。 - LINQ: LINQ を使用して、より複雑なクエリを実行することも可能です。
コード例の詳細な解説
- 辞書の初期化:
Dictionary<string, int> ages
で、文字列をキー、整数を値とする辞書を作成しています。 - 要素の追加:
Add
メソッドを使用して、キーと値のペアを追加しています。 - foreach ループ:
foreach
ループを使用して、辞書のすべての要素を順番に処理しています。 - キーと値へのアクセス:
item.Key
とitem.Value
で、キーと値にアクセスし、コンソールに出力しています。
C# の辞書型は、キーと値のペアを効率的に管理するための便利なデータ構造です。foreach
ループを使用することで、辞書の要素を簡単に反復処理できます。キー、値、または両方に対して、さまざまな処理を行うことができます。
- 辞書に要素を追加、削除する方法
- 辞書内の特定のキーが存在するか調べる方法
- LINQ を使用した辞書の操作
- 辞書のパフォーマンスに関する注意点
for ループによるインデックスアクセス
foreach
ループが一般的ですが、for
ループを用いて、インデックスを指定して要素にアクセスすることも可能です。ただし、辞書の要素の順番は保証されないため、インデックスと要素の対応関係は実行時に変化する可能性があります。
for (int i = 0; i < ages.Count; i++)
{
KeyValuePair<string, int> item = ages.ElementAt(i);
Console.WriteLine($"{item.Key}さんは{item.Value}歳です。");
}
注意: ElementAt
メソッドは、毎回新しい KeyValuePair
オブジェクトを生成するため、パフォーマンスに影響を与える可能性があります。
LINQ によるクエリ
LINQ (Language Integrated Query) を使うと、辞書を対象にさまざまな種類のクエリを実行できます。
// 年齢が30歳以上の人の名前を取得
var names = ages.Where(x => x.Value >= 30).Select(x => x.Key);
foreach (var name in names)
{
Console.WriteLine(name);
}
LINQ は、より複雑な条件や変換を記述する際に強力なツールです。
Parallel.ForEach による並列処理
大量のデータを扱う場合、Parallel.ForEach
を使用して並列処理を行うことで、処理速度を向上させることができます。
Parallel.ForEach(ages, item =>
{
Console.WriteLine($"{item.Key}さんは{item.Value}歳です。");
});
注意: 並列処理は、共有変数の競合やデッドロックなどの問題を引き起こす可能性があるため、慎重に使用する必要があります。
カスタム イテレータ
より高度な制御が必要な場合は、カスタム イテレータを実装することも可能です。
public class MyDictionaryEnumerator
{
// ... イテレータの実装 ...
}
どの方法を選ぶべきか?
- 単純な反復:
foreach
ループが最もシンプルで一般的です。 - インデックスが必要:
for
ループを使用します。 - 複雑な条件や変換: LINQ を使用します。
- 並列処理:
Parallel.ForEach
を使用します。 - 高度な制御: カスタム イテレータを実装します。
選択する方法は、処理の内容、パフォーマンスの要件、コードの可読性など、さまざまな要素を考慮して決定する必要があります。
C# の辞書型を反復処理する方法は複数あります。それぞれの方法に特徴があり、状況に応じて適切な方法を選ぶことが重要です。
- どの方法がパフォーマンスが良いか?
- LINQ を使って辞書をソートする方法
- カスタム イテレータの具体的な実装例
- 並列処理の注意点
c# dictionary loops