セージ の メモ書き

メモこそ命の恩人だ

LINQ の Join と GroupJoin してみる

以下の personList, teamList オブジェクトを使用して試してみる。

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int TeamId { get; set; }
}
public class Team
{
    public int TeamId { get; set; }
    public string TeamName { get; set; }
}
var personList = new List<Person>()
{
    new Person { Id = 1, Name = "Name01", TeamId = 1 },
    new Person { Id = 2, Name = "Name02", TeamId = 1 },
    new Person { Id = 3, Name = "Name03", TeamId = 2 },
    new Person { Id = 4, Name = "Name04", TeamId = 10 },
};
var teamList = new List<Team>()
{
    new Team { TeamId = 1, TeamName = "TeamA" },
    new Team { TeamId = 2, TeamName = "TeamB" },
    new Team { TeamId = 3, TeamName = "TeamC" },
};

Join メソッド

Enumerable.Join Method (System.Linq) | Microsoft Docs

  • 指定したキーのプロパティをもとに、2つのコレクションを結合する。
  • 指定したキーが一致すれば結合する。(つまり、内部結合で動作する。)
  • DefaultIfEmpty メソッドを使えば、外部結合もできる。

こんな感じ。

var result = personList.Join(
                teamList, 
                p => p.TeamId, 
                t => t.TeamId, 
                (p, t) => new { p.Id, p.Name, t.TeamName });

foreach (var x in result) Debug.Write($"{x.Id}, {x.Name}, {x.TeamName}{Environment.NewLine}");
// 1, Name01, TeamA
// 2, Name02, TeamA
// 3, Name03, TeamB

// 指定したプロパティで結合できたことを確認。内部結合で動作してる。

GroupJoin メソッド

Enumerable.GroupJoin Method (System.Linq) | Microsoft Docs

こんな感じ。

var groupList = teamList.GroupJoin(
                    personList, 
                    t => t.TeamId, 
                    p => p.TeamId, 
                    (t, pList) => new { TeamName = t.TeamName, PersonList = pList });

foreach (var group in groupList)
{
    Debug.Write($"Key : {group.TeamName}{Environment.NewLine}");
    foreach (var x in group.PersonList) Debug.Write($"    Id : {x.Id}, Name : {x.Name}{Environment.NewLine}");
}
// Key : TeamA
//     Id : 1, Name : Name01
//     Id : 2, Name : Name02
// Key : TeamB
//     Id : 3, Name : Name03
// Key : TeamC

// 指定したプロパティで結合できたことを確認。グルーピングもできてる。


以上😃