本記事の概要
この記事では、LINQを使用して、[.NET クラスライブラリ Tips][LINQ] 2つのコレクションを共通のキーに基づいて結合する(Joinメソッド)方法について説明します。
公式サイト情報はコチラを参照してください。
2つのコレクションを共通のキーに基づいて結合する
C# LinqのJoinメソッドは、2つのコレクションを共通のキーに基づいて結合するメソッドです。Joinメソッドは、内部結合と呼ばれる結合方法を実現します。内部結合とは、キーが一致する要素だけを結果に含める結合方法です。
Join メソッドの構文は以下の通りです
var result = source.Join( inner, // 結合するコレクション outerKeySelector, // sourceのキー項目を指定する関数 innerKeySelector, // innerのキー項目を指定する関数 resultSelector // 結果の要素を生成する関数 );
sourceとinnerは、どちらもIEnumerable<T>型のコレクションです。outerKeySelectorとinnerKeySelectorは、それぞれsourceとinnerの要素からキー項目を取り出す関数です。resultSelectorは、sourceとinnerの要素から結果の要素を生成する関数です。
使用例
例えば、以下のようなPersonクラスとPetクラスがあるとします。
class Person { public string Name { get; set; } public int Age { get; set; } } class Pet { public string Name { get; set; } public Person Owner { get; set; } }
PersonクラスのオブジェクトのリストとPetクラスのオブジェクトのリストを作成します。
var people = new List { new Person { Name = "Alice", Age = 20 }, new Person { Name = "Bob", Age = 25 }, new Person { Name = "Charlie", Age = 30 } }; var pets = new List { new Pet { Name = "Barley", Owner = people[0] }, new Pet { Name = "Boots", Owner = people[1] }, new Pet { Name = "Whiskers", Owner = people[2] }, new Pet { Name = "Daisy", Owner = people[0] } };
このとき、人とその飼っているペットの名前を結合して表示するには、以下のようにJoinメソッドを使います。
var query = people.Join( pets, // 結合するコレクション person => person, // peopleのキー項目はPersonオブジェクトそのもの pet => pet.Owner, // petsのキー項目はOwnerプロパティ (person, pet) => $"{person.Name} owns {pet.Name}" // 結果の要素は文字列 ); foreach (var item in query) { Console.WriteLine(item); }
実行結果は以下のようになります。
Alice owns Barley Alice owns Daisy Bob owns Boots Charlie owns Whiskers
このように、Joinメソッドを使うと、2つのコレクションを共通のキーに基づいて結合することができます。キー項目は単一のプロパティだけでなく、複数のプロパティや匿名型なども使えます。また、結果の要素は任意の型や匿名型にもできます。
.NET クラス Tips 一覧
これまでに紹介した .NET Tips 一覧はこちら。
Please follow and like us:
コメント