C# の辞書を反復する最良の方法

Puneet Dobhal 2023年10月12日
  1. C# でディクショナリを反復するために for ループを使用する
  2. foreach ループを使用して C# の辞書を繰り返し処理する
  3. C# で ParallelEnumerable.ForAll メソッドを使用して辞書を反復する
C# の辞書を反復する最良の方法

C# の辞書は、キーと値のペアのコレクションです。これは、key が単語を表し、value がその意味である英語の辞書にいくぶん似ています。この記事では、辞書を反復するさまざまな方法を見ていきます。

表現の目的で、記事全体を通して、辞書オブジェクトの次の定義を検討します。

Dictionary<int, string> sample_Dict = new Dictionary<int, string>();

ここで、この辞書をトラバースするために使用できるいくつかのメソッドを見てみましょう。

C# でディクショナリを反復するために for ループを使用する

for ループメソッドは簡単で簡潔で、インデックスを使用して辞書を順次反復します。

using System;
using System.Collections.Generic;

public class Sample {
  public static void Main() {
    Dictionary<int, string> sample_Dict =
        new Dictionary<int, string>() { { 0, "value_1" }, { 1, "value_2" }, { 2, "value_3" } };
    for (int index = 0; index < sample_Dict.Count; index++)
      System.Console.WriteLine(index + ":" + sample_Dict[index]);
  }
}

出力:

0:value_1
1:value_2
2:value_3

気づくと思いますが、Dictionary オブジェクトを定義するときにイニシャライザリストも指定しています。イニシャライザリストを指定するときは、リストの各エントリに一意のキーがあることを確認してください。そうしないと、Run-time 例外が発生します。

foreach ループを使用して C# の辞書を繰り返し処理する

foreach ループは、選択できる別の選択肢です。

using System;
using System.Collections.Generic;

public class Sample {
  public static void Main() {
    Dictionary<int, string> sample_Dict =
        new Dictionary<int, string>() { { 0, "value_1" }, { 1, "value_2" }, { 2, "value_3" } };
    foreach (var entry in sample_Dict) System.Console.WriteLine(entry.Key + ":" + entry.Value);
  }
}

出力:

0:value_1
1:value_2
2:value_3

上記のメソッドは、foreach ループの遅延実装と考えることができます。KeyValuePair<TKey,TValue> 構造を使用して、foreach メソッドを実装することもできます。

using System;
using System.Collections.Generic;

public class Sample {
  public static void Main() {
    Dictionary<int, string> sample_Dict =
        new Dictionary<int, string>() { { 0, "value_1" }, { 1, "value_2" }, { 2, "value_3" } };
    foreach (var entry in sample_Dict) System.Console.WriteLine(entry.Key + ":" + entry.Value);
  }
}

出力:

0:value_1
1:value_2
2:value_3

C# で ParallelEnumerable.ForAll メソッドを使用して辞書を反復する

このメソッドは、辞書内のキーと値のペアごとにマルチスレッド処理を組み込んでいるため、大きな辞書を反復する場合に便利です。

using System;
using System.Linq;
using System.Collections.Generic;

public class Sample {
  public static void Main() {
    /*User Code Here*/
    Dictionary<int, string> sample_Dict =
        new Dictionary<int, string>() { { 0, "value_1" }, { 1, "value_2" }, { 2, "value_3" } };
    sample_Dict.AsParallel().ForAll(entry => Console.WriteLine(entry.Key + ":" + entry.Value));
  }
}

出力:

0 : value_1 1 : value_2 2 : value_3

上記の中で最良の方法を分析する場合、特定のパラメーターを考慮する必要があり、結果は状況に依存します。ループ方法は簡潔で効果的ですが、大きな辞書を繰り返す場合、実行時の複雑さの点で実用的ではなくなります。

これは、ParallelEnumerable.ForAll メソッドが登場する場所であり、特定のアプリケーションを設計する際の重要な要素である可能性がある重要な時間を節約する同時実行を可能にします。

関連記事 - Csharp Dictionary