具有以下类(高度简化):
public class Child
{
public string Label;
public int CategoryNumber;
public int StorageId;
}
public class Parent
{
public string Label;
public List<Child> Children = new List<Child>();
}
并具有以下数据:
var parents = new List<Parent>();
var parent = new Parent() {Label="P1"};
parent.Children.Add(new Child() {Label="C1", CategoryNumber=1, StorageId=10});
parent.Children.Add(new Child() {Label="C2", CategoryNumber=2, StorageId=20});
parents.Add(parent);
parent = new Parent() {Label="P2"};
parent.Children.Add(new Child() {Label="C3", CategoryNumber=1, StorageId=10});
parent.Children.Add(new Child() {Label="C4", CategoryNumber=2, StorageId=30});
parents.Add(parent);
parent = new Parent() {Label="P3"};
parent.Children.Add(new Child() {Label="C5", CategoryNumber=3, StorageId=10});
parent.Children.Add(new Child() {Label="C6", CategoryNumber=2, StorageId=40});
parents.Add(parent);
现在,我如何从至少包含一个 CategoryNumber = 1 的 child 的 parent 列表中获取 child 列表(CategoryNumber = 2)?
我可以执行以下操作,但它似乎不是最优的:
var validParents = from p in parents
where p.Children.Any (c => c.CategoryNumber==1)
select p;
var selectedChildren = validParents.Select(p => from c in p.Children
where c.CategoryNumber == 2
select c);
这是我为 selectedChildren 得到的:
-
IEnumerable<IEnumerable<Child>>
-
IEnumerable<Child>
- C2 2 20
-
IEnumerable<Child>
- C4 2 30
-
是否有可能只有一个平面列表包含两个子元素而不是两个子列表?它在 LINQ 中如何翻译?
最佳答案
您可以使用 SelectMany 将几个查询串联在一起和 Where .
var selectedChildren = (from p in parents
where p.Children.Any (c => c.CategoryNumber==1)
select p)
.SelectMany(p => p.Children)
.Where(c => c.CategoryNumber == 2);
// or...
var selectedChildren = parents
.Where(p => p.Children.Any(c => c.CategoryNumber == 1))
.SelectMany(p => p.Children)
.Where(c => c.CategoryNumber == 2);
关于c# - LINQ:如何将内部列表中的项目放入一个列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1028605/