C# でリストを辞書に変換する

Rana Hasnain Khan 2024年2月15日
  1. C# でリストを辞書に変換する
  2. C# で LINQ ToDictionary() メソッドを使用してリストを辞書に変換する
  3. C# で Non-Linq メソッドを使用してリストを辞書に変換する
C# でリストを辞書に変換する

この記事では、ToDictionary() を使用してリストを辞書に変換する方法を学び、重複したキーを処理する方法についても理解します。

C# でリストを辞書に変換する

リストを辞書に変換しなければならない状況はたくさんあります。 リストを辞書に簡単に変換できる方法がいくつかあります。

これらの方法については、以下の例で詳しく説明します。

C# で LINQ ToDictionary() メソッドを使用してリストを辞書に変換する

リストをディクショナリに変更する最も簡単な方法は、以下に示す LINQ ToDictionary() メソッドを使用することです。

コード例:

#Csharp
using System.Linq;

var seasonList = GetSeasonsList();
var seasonsById = seasonList.ToDictionary(keySelector: s => S.Id, elementSelector: s => s);

これは、リスト内でループすることによって機能し、ディクショナリを形成するために修正したキー/要素セレクター ラムダを利用します。

ここで、keySelector および elementSelector パラメータは、読みやすいようにこのように記載されています。

C# で Non-Linq メソッドを使用してリストを辞書に変換する

ループを使用して、LINQ 以外の方法でリストを辞書に変換することもできます。

コード例:

#Csharp
var seasons = GetSeasonList();
var seasonById = new Dictionary<int, Season>();

foreach (var season in seasons) {
  seasonById.Add(season.Id, season);
}

パフォーマンスが向上するため、LINQ 以外の方法を使用することをお勧めしますが、好みに応じてどちらの方法も使用できます。

これらのメソッドでは、2 種類の要素セレクターを使用できます。 1つは暗黙的な要素セレクターで、もう 1つは明示的な要素セレクターです。

これら 2つのステートメントを使用すると、結果は同じになります。 以下に示すように、暗黙的な要素セレクターを使用しましょう。

コード例:

#Csharp
var seasonsById = seasonList.ToDictionary(keySelector: s => s.Id, elementSelector: s => s);

以下に示すように、明示的な要素セレクターを使用しましょう。

コード例:

#Csharp
var seasonById = seasonList.ToDictionary(keySelector: s => s.Id);

要素セレクターは、リスト内の項目を定義していない場合、それらを要素として自動的に使用します。 これは、プロパティの 1つでオブジェクトをマークする際に必要になる場合があります。

C# での重複キー

リストのキーが重複している可能性があります。 このシナリオでは、ToDictionary()System.ArgumentException という例外を表示します。

以下に示すコードを使用して重複キーを追加しようとすると、同じキーを持つ項目が既にリストにあることがわかります。

構文:

#Csharp
Dictionary.Add(key, value)

上記のコードを使用すると、同じ例外が発生します。 これは、Dictionary.Add(key, value) を使用して重複キーを挿入しようとしたときに発生する例外と同じです。

例外として、データ内のキーの重複を避けることができます。

データに重複キーが必要な場合は、それらをキーでグループ化し、値に必要なものを選択する必要があります。 以下で説明するいくつかのオプションを見てみましょう。

C# のキーの集計値

まず、アイテム数を見積もります。 私たちは言葉を繰り返すことができます。

これを実現するには、単語でグループ化し、集計としてカウントを設定する必要があります。

以下に示すように、これを使用して重複キーをチェックする例を見てみましょう。

コード例:

#Csharp
var seasons = new List<string> { "You", "Breaking Bad", "Marvel", "You" };

var seasonCountMap =
    seasons.GroupBy(s => s).ToDictionary(keySelector: m => m.Key, elementSelector: m => m.Count());

foreach (var seasonCount in seasonCountMap) {
  Console.WriteLine($"{seasonCount.Key}={seasonCount.Value}");
}

出力:

C の重複キー

C# のキーの要素のリスト

ここでは、リリース年に従っていくつかのシーズンをカタログ化します。 毎年多くのシーズンがリリースされる可能性があります。

リストの辞書を作成するには、以下に示すように次のコードを使用できます。

コード例:

#Csharp
var seasonList = GetSeasonList();
var seasonByYear = seasonList.GroupBy(s => s.YearOfRelease)
                       .ToDictionary(keySelector: m => m.Key, elementSelector: m => m.ToList());

foreach (var seasonGroup in seasonByYear) {
  Console.WriteLine(
      $"{seasonGroup.Key}={string.Join(", ", seasonGroup.Value.Select(v => v.Name))}");
}

C# のキーを持つ最初の要素

重複キーの場合、グループを説明する項目の 1つを選択する必要があります。 グループ内の最初の要素を代表として選択できます。

例を見てみましょう。 以下に示すように、年ごとに季節をリストし、年に 1つの季節のみを選択しました。

コード例:

#Csharp
var seasonList = GetSeasonList();

var seasonsByYear = seasonList.GroupBy(s => s.YearOfRelease)
                        .ToDictionary(keySelector: m => m.Key, elementSelector: m => m.First());

Foreach(var season in seasonsByYear) {
  Console.WriteLine($"{season.Key}={season.Value.Name}");
}

C# でループして重複をチェック

LINQ メソッドの代わりに loop メソッドを使用する場合は、キーが存在するかどうかを確認する必要があります。 これにより、重複に簡単に対処できます。

また、重複をどのように処理するかを完全に自由に選択できます。

コード例:

#Csharp
using System.IO;
using System;

class Program {
  static void Main() {
    var seasons = GetSeasonList();
    var seasonsByYear = new Dictionary<int, List<Season>>();
    foreach (var season in seasons) {
      if (!seasonByYear.ContainsKey(season.YearOfRelease)) {
        seasonByYear.Add(season.YearOfRelease, new List<Season>());
      }
      seasonByYear[season.YearOfRelease].Add(season);
    }
    foreach (var seasonGroup in seasonByYear) {
      Console.WriteLine(
          $"{seasonGroup.Key}={string.Join(", ", seasonGroup.Value.Select(m =>m.Name))}");
    }
  }
}

この例では、毎年リリースされるシーズンのリストが作成されています。 キーがまだ指定されていないことに関数が気付くと、空のリストが表示され、season が追加されます。

Rana Hasnain Khan avatar Rana Hasnain Khan avatar

Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.

LinkedIn

関連記事 - Csharp Dictionary

関連記事 - Csharp List