[.NET クラスライブラリ Tips][LINQ] 2つのシーケンスをグループ化し、それらを一緒に出力する(GroupJoinメソッド)

スポンサーリンク

本記事の概要

この記事では、LINQを使用して、 2つのシーケンスをグループ化し、それらを一緒に出力する方法について説明します。

公式サイト情報はコチラを参照してください。

 

2つのシーケンスをグループ化し、それらを一緒に出力する

C# LINQのGroupJoinメソッドは、2つのシーケンスをグループ化し、それらを一緒に出力するのに使用されます。1つ目のシーケンスは、グループ化の基礎となるキーを含み、2つ目のシーケンスは、グループ化される要素を含みます。

以下は、GroupJoinメソッドの使用例です。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Order
    {
        public int OrderId { get; set; }
        public string CustomerName { get; set; }
    }

    class OrderItem
    {
        public int OrderId { get; set; }
        public string ItemName { get; set; }
        public decimal Price { get; set; }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            var orders = new List
            {
                new Order { OrderId = 1, CustomerName = "ジョン" },
                new Order { OrderId = 2, CustomerName = "アリス" },
                new Order { OrderId = 3, CustomerName = "スティーブ" },
            };

                        var orderItems = new List
            {
                new OrderItem { OrderId = 1, ItemName = "本", Price = 1000 },
                new OrderItem { OrderId = 1, ItemName = "ペン", Price = 200 },
                new OrderItem { OrderId = 2, ItemName = "バッグ", Price = 2000 },
                new OrderItem { OrderId = 2, ItemName = "鉛筆", Price = 100 },
                new OrderItem { OrderId = 3, ItemName = "ノート", Price = 500 },
                new OrderItem { OrderId = 3, ItemName = "消しゴム", Price = 100 },
            };

            var query = orders.GroupJoin(orderItems, o => o.OrderId, oi => oi.OrderId, (o, oi) => new
            {
                OrderId = o.OrderId,
                CustomerName = o.CustomerName,
                OrderItems = oi.Select(i => new { ItemName = i.ItemName, Price = i.Price })
            });

            foreach (var order in query)
            {
                Console.WriteLine($"注文番号: {order.OrderId}");
                Console.WriteLine($"顧客名: {order.CustomerName}");
                Console.WriteLine("注文アイテム:");
                foreach (var item in order.OrderItems)
                {
                    Console.WriteLine($"\t{item.ItemName}, {item.Price:C}");
                }
                Console.WriteLine();
            }
            Console.ReadLine();

        }
    }
}

上記のコードでは、OrderクラスとOrderItemクラスが定義されており、ordersとorderItemsという2つのリストが作成されています。

GroupJoinメソッドを使用して、ordersとorderItemsをOrderIdで結合し、新しいオブジェクトのコレクションを作成しています。最後に、返されたオブジェクトのリストを反復処理して、それぞれのOrderオブジェクトに関連付けられたOrderItemオブジェクトを表示しています。

実行すると、以下のような結果が得られます。

注文番号: 1
顧客名: ジョン
注文アイテム:
        本, ¥1,000
        ペン, ¥200

注文番号: 2
顧客名: アリス
注文アイテム:
        バッグ, ¥2,000
        鉛筆, ¥100

注文番号: 3
顧客名: スティーブ
注文アイテム:
        ノート, ¥500
        消しゴム, ¥100

.NET クラス Tips 一覧

これまでに紹介した .NET Tips 一覧はこちら

Please follow and like us:

コメント

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