[.NET クラスライブラリ Tips][LINQ] 2つのコレクションを共通のキーに基づいて結合する(Joinメソッド)

スポンサーリンク

本記事の概要

この記事では、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:

コメント

タイトルとURLをコピーしました