我有一个项目集合,每个项目都包含一个二级集合。我需要根据次要项目的总集生成新项目列表。例如,如果你有一个狗的列表,每只狗都有一个 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/