了解 Linq 链接语法中的 GroupJoin 和 Join(家庭作业)

我需要帮助来理解 GroupJoin 的第四个参数。据我所知,到目前为止 GroupJoin 有 4 个参数: (1, 2) - 第一个是辅助列表,第二个参数是一个 Func,它从第一个对象类型返回键,换句话说,在这种情况下从第一个列表返回(人们)。(3, 4) 一个 Func,在本例中返回第二个列表中的第二个对象类型的键(项目),以及一个将分组对象与组本身一起存储的函数(我无法理解这部分的代码) . 考虑到这一点并具有以下代码:


var products = new Product[]

{

    new Product { Id = 1, Type = "Phone", Model = "OnePlus", Price = 1000 },

    new Product { Id = 2, Type = "Phone", Model = "Apple", Price = 2000 },

    new Product { Id = 3, Type = "Phone", Model = "Samsung", Price = 1500 },

    new Product { Id = 4, Type = "TV", Model = "Samsung 32", Price = 200 },

};


var people = new Person[]

{

    new Person { Id = 1, Name = "Ivan Ivanov", Money = 150000 },

    new Person { Id = 2, Name = "Dragan Draganov", Money = 250000 },

    new Person { Id = 3, Name = "Ivelin Ivelinov", Money = 350000 

}

};


var items = new Item[]

{

    new Item { PersonId = 1, ProductId = 1, Amount = 1 },

    new Item { PersonId = 1, ProductId = 4, Amount = 1 },

    new Item { PersonId = 1, ProductId = 5, Amount = 1 },

    new Item { PersonId = 1, ProductId = 7, Amount = 1 },

    new Item { PersonId = 2, ProductId = 2, Amount = 1 },

};

询问:


var productOwnerList = people

    .GroupJoin(

        items,

        o => o.Id,

        i => i.PersonId,

        (o, i) => new   <--- (**)            

        {

            Person = o,

            Products = i

                .Join(products,

                    o1 => o1.ProductId,

                    i2 => i2.Id,

                 (o1, i2) => i2)          <--- (*)

                .ToArray()

        })

    .ToArray();  

顺便提一下,我只发布了几行数据。我需要帮助来理解 join 方法的第四个参数在这里执行的是什么 -> (*) (将分组对象与组本身一起存储)?当我看到结果时,我看到它把所有人员 ID 与产品密钥关联起来,并根据项目列表(一对多)加入两个列表。但我无法理解这一行的确切含义 (o1, o2) => i2)。很明显在做什么(将所有与个人 ID 关联的项目放入每个人的数组 (items[]) 中。但是这里的“幕后”是什么?还有一个关于 (**) 这一行的问题,它正在创建新的对象,这是一个匿名类,如果不是,它是什么。


Smart猫小萌
浏览 140回答 1
1回答

12345678_0001

第四个参数——映射到文档中的第五个参数(因为第一个参数是扩展方法调用的目标)只是结果选择器。这是一个接受两个参数的函数:第一个是“外部”序列的一个元素(在你的例子中是数组),第二个是“内部”序列(在你的例子中是数组)的元素序列,它们具有相同的元素键作为外部元素。该函数应返回一个“结果”元素,方法调用的总体结果是这些结果的序列。peopleitems每个“外部”元素都会调用一次该函数,因此您将拥有:第一次调用:人员 ID 1,以及 ID 为 1、4、5、7 的产品第二次调用:人 ID 2,ID 2 的产品第三次调用:人员 ID 3 和一个空的产品序列您的查询很复杂,因为您正在为结果使用匿名类型,并使用另一个查询构造匿名类型的实例。这是一个可能有助于澄清的更简单的查询:var productOwnerList = people     .GroupJoin(         items,         o => o.Id,         i => i.PersonId,         (person, items) => $"{person.Id}: {string.Join(",", items.Select(item => item.ProductId))}"     .ToArray();
打开App,查看更多内容
随时随地看视频慕课网APP