Please input markdown here## Linq でコレクションを辞書やハッシュセットに変換したい
リストなどのコレクションに格納されたデータを辞書やハッシュテーブルに変換したい場合、Linq の ToDictionary
や ToHashSet
が使用できます。
ToDictionary で辞書型に変換
Enumerable.ToDictionary メソッド (System.Linq) | Microsoft Docs
例えば ID と 名前からなる Person
型のデータがあるとして、このデータのリストを辞書に変換する例を考えます。
static void Main(string[] args)
{
var list = new List<Person>()
{
new Person() { ID = 1, Name = "taro" },
new Person() { ID = 2, Name = "jiro" },
};
// 辞書のキーだけを指定する(バリューは元の型Personになる)
Dictionary<int, Person> dictionary1 = list.ToDictionary(p => p.ID);
// 辞書のキーとバリュー両方を指定する
Dictionary<int, string> dictionary2 = list.ToDictionary(p => p.ID, p => p.Name);
}
class Person
{
public int ID { get; set; }
public string Name { get; set; }
}
ToDictionary
は第一引数でキーのセレクタ、第二引数でバリューのセレクタを指定します。第二引数の指定がなければバリューは元の型全体になります。
キーが重複する場合例外が発生するので気を付ける必要があります。
ToHashSet でセットに変換
Enumerable.ToHashSet メソッド (System.Linq) | Microsoft Docs
リストなどのコレクションをセットに変換する場合は ToHashSet
で変換できます。
※.NET Framework 4.7.2 以降くらいじゃないと使えないみたいです。
var a = new int[] { 3, 1, 4, 1, 5, 9, 2 };
var set = a.ToHashSet();
Console.WriteLine(set.Count); // 6
// var s = new HashSet<int>(a);
// 上記コードと同じような意味
元のコレクション内に同じ値が存在しても問題なくセットに変換できます。
Linq には重複を削除する Distinct
がありますが、ToHashSet
にすると型ごと変換してくれます。HashSet
のコンストラクタにコレクションを渡した動きと同じようになります。
コメントを書く