c# - 在 LINQ 中加入父集合和子集合以获得单个合并输出

标签 c# linq

我有一个项目集合,每个项目都包含一个二级集合。我需要根据次要项目的总集生成新项目列表。例如,如果你有一个狗的列表,每只狗都有一个 friend 列表,我需要所有狗的所有狗 friend 的总列表。

通常我会使用 SelectMany 执行此操作,但这里的困难是我的辅助对象不包含对父对象的引用,并且新列表需要包含来自辅助对象和父对象的字段。即如下

var dogs = List<Dog>
var newList = dogs.SelectMany(i => i.DogFriends).Select(dogFriend => new NewObject
            {
                fieldOne = dog.propertyOne,
                fieldTwo = dog.propertyTwo
                fieldThree = dogFriend.propertyOne
            });

在上面,我没有提到狗,所以我不能选择那些。

我正在寻找的是一种像在 SQL 中一样对两个表进行连接的方法,这样您就可以从两个对象中选择值。但我希望总值与子对象的总数相匹配。也就是说,如果您有 3 只狗,每只狗有 3 个 friend ,那么最终列表将有 9 个对象。

如何使用 LINQ 实现此目的?

最佳答案

的确 .SelectMany(...) 就是答案。另一种用法是:

var data = dogs
    .SelectMany(d => d.DogFriends.Select(df => new { d, df })
    .Select(x =>
        // Now you can use both d and df
        new NewObject {
            fieldOne = x.d.propertyOne,
            fieldTwo = x.d.propertyTwo
            fieldThree = x.df.propertyOne
        }
    )
    .ToArray();

更简单的是使用查询 LINQ 表示法。这基本上在编译时转化为上述内容。

var data = from d in dogs
           from df in d.DogFriends
           select new NewObject {
               fieldOne = d.propertyOne,
               fieldTwo = d.propertyTwo
               fieldThree = df.propertyOne
           }

关于c# - 在 LINQ 中加入父集合和子集合以获得单个合并输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35890505/

相关文章:

c# - 我想要 "clone"谷歌日历与 c# .net 的接口(interface)

c# - 分块下载文件 (Windows Phone)

c# - sql WHERE {params} 中可以有很多参数吗?

c# - 按数组元素排序 Linq 列表

c# - 使用 LINQ 计算特定列的总和

Java 表达式树

c# - O(1) 在使用替代比较器时保持在哈希集查找中?

c# - WinApi SendMessage/PostMessage 在我的电脑上不工作?

C#:按可为空的 DateTime 属性对对象列表进行排序

c# - LINQ/DataTable 按多个条件分组并获取最大值