C# Linq的GroupJoin()方法 – 将两个序列中的元素联接在一起,并根据指定的键对结果进行分组

  • Post category:C#

C# Linq中的GroupJoin()函数是一种形式的连接,它可以将两个序列中的元素通过某个键关联起来,并且将拥有相同键的元素分组在一起。本文将会详细讲解GroupJoin()函数的用法和参数,并且提供示例进行说明。

函数语法

GroupJoin()函数语法如下:

var result = outerGroup.GroupJoin(innerGroup,
    outerKeySelector => outerKeySelector,
    innerKeySelector => innerKeySelector,
    (outer, innerCollection) => new { Outer = outer, InnerCollection = innerCollection });

其中,outerGroup代表外部序列,innerGroup代表内部序列,outerKeySelector表示一个函数,用于从外部序列中选择关联的键,innerKeySelector表示一个函数,用于从内部序列中选择关联的键,最后一个参数是一个回调函数,它用于创建输出序列元素。

示例解释

以下是两个示例程序,用于说明GroupJoin()函数的使用方法:

示例程序1 – 外关联-内集合

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var users = new List<User>
        {
            new User { Id = 1, Name = "张三" },
            new User { Id = 2, Name = "李四" },
            new User { Id = 3, Name = "王五" }
        };

        var orders = new List<Order>
        {
            new Order { UserId = 1, Id = 1001, OrderNo = "20210101" },
            new Order { UserId = 1, Id = 1002, OrderNo = "20210102" },
            new Order { UserId = 2, Id = 1003, OrderNo = "20210103" },
            new Order { UserId = 3, Id = 1004, OrderNo = "20210104" }
        };

        var result = users.GroupJoin(
            orders,
            u => u.Id,
            o => o.UserId,
            (user, orderCollection) =>
                new
                {
                    User = user,
                    Orders = orderCollection
                }
            );

        foreach (var item in result)
        {
            Console.WriteLine($"用户:{item.User.Name}");
            foreach (var order in item.Orders)
            {
                Console.WriteLine($"订单号:{order.OrderNo}");
           }
            Console.WriteLine("==================");
        }
    }
}

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public string OrderNo { get; set; }
}

上面的示例程序使用了GroupJoin()方法,将用户和订单的集合进行关联。在这个程序中,我们先创建了两个集合,一个用户集合和一个订单集合。然后,我们使用GroupJoin()方法来将这两个集合关联起来。使用GroupJoin()方法,我们将用户集合设置为外部序列,订单集合设置为内部序列。接着,我们选择用户集合中的Id属性作为外部连接键,订单集合中的UserId属性作为内部连接键。

在第四个参数中我们为输出序列元素创建一个回调函数。在这个回调函数中,我们创建了一个包含所有匹配订单的订单集合,然后返回了一个包含了当前用户信息和相关订单集合的匿名类型。

示例程序2 – 内关联

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var users = new List<User>
        {
            new User { Id = 1, Name = "张三" },
            new User { Id = 2, Name = "李四" },
            new User { Id = 3, Name = "王五" }
        };

        var orders = new List<Order>
        {
            new Order { UserId = 1, Id = 1001, OrderNo = "20210101" },
            new Order { UserId = 1, Id = 1002, OrderNo = "20210102" },
            new Order { UserId = 3, Id = 1003, OrderNo = "20210103" },
            new Order { UserId = 3, Id = 1004, OrderNo = "20210104" }
        };

        var result = users.GroupJoin(
            orders,
            u => u.Id,
            o => o.UserId,
            (user, orderCollection) =>
                new
                {
                    User = user,
                    Orders = orderCollection
                }
            ).Where(x => x.Orders.Any());

        foreach (var item in result)
        {
            Console.WriteLine($"用户:{item.User.Name}");
            foreach (var order in item.Orders)
            {
                Console.WriteLine($"订单号:{order.OrderNo}");
            }
            Console.WriteLine("==================");
        }
    }
}

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public string OrderNo { get; set; }
}

上面的示例程序用到了GroupJoin()方法进行内连接。在这个程序中,我们同样创建了用户和订单的集合。然后,我们使用GroupJoin()方法将这两个集合关联起来。在这个示例中,我们使用与之前示例中相同的参数但没有第四个参数,就是没有传递创建输出序列元素的回调函数。这意味着,我们只查询拥有订单的用户。我们使用Where方法来过滤掉没有订单的用户,只保留拥有订单的用户。

总结

C# Linq的GroupJoin()函数可以将两个序列中的元素通过某个键关联起来,并且将拥有相同键的元素分组在一起。在使用GroupJoin()方法时,我们必须指定外部序列,内部序列,外部连接键和内部连接键。如果我们想要创建输出序列元素,我们还需要提供一个回调函数。 GroupJoin()方法支持外连接、左连接和内连接的操作。