c# - LINQ:如何将内部列表中的项目放入一个列表中?

标签 c# linq list

具有以下类(高度简化):

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/

相关文章:

c# - Linq:对列表进行分组,对其进行排序并获得最高的 x 值?

c# - Entity Framework LINQ to Entities 加入查询超时

c# - 如何将 Bitmap 转换为 byte[]?

c# - 如何检测: scrolling - up or down?

c# - 在检查器中设置值是否与在 Unity 中设置默认值相同?

python - 嵌套列表的 Groupby

c++ - 为什么STL不提供c风格列表?

python - 从元组列表中,获取最接近给定值的元组

c# - 如何使用 C# 以编程方式复制 MS SQL 2000 数据库?

c# - 是否有将整数百位转换为零的二进制方法?