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#
のキーの要素のリスト
ここでは、リリース年に従っていくつかのシーズンをカタログ化します。 毎年多くのシーズンがリリースされる可能性があります。
リストの辞書を作成するには、以下に示すように次のコードを使用できます。
コード例:
#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 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