繁体   English   中英

C#LINQ-根据另一个列表内的子属性返回类型化的过滤列表

[英]C# LINQ - Return a typed filtered list based on a child property that is inside another list

给定对象:

class Parent
{
    private int id;

    public int Id
    {
        get { return id; }
        set { id = value; }
    }

    private List<Child> childrenList;

    public List<Child> ChildrenList
    {
        get { return childrenList; }
        set { childrenList = value; }
    }
}

class Child
{
    private int idSub;

    public int IdSub
    {
        get { return idSub; }
        set { idSub = value; }
    }

    private bool isST;

    public bool IsST
    {
        get { return isST; }
        set { isST = value; }
    }
}

我有一个List<Parent> parentList = new List<Parent>()并且在Parent对象内有一个称为List<Parent> parentList = new List<Parent>()Child列表。

Child拥有财产IsST

我只想返回具有IsST属性等于true的Child ,并且如果Parent不满足该条件,则不需要返回。

并且返回的两个列表都需要分别输入其类型。

到目前为止,我有:

List<Parent> parentList = new List<Parent>()
{
    new Parent()
    {
        Id = 1,
        ChildrenList = new List<Child>()
        {
           new Child()
           {
               IdSub = 1,
               IsST = true
           },
           new Child()
           {
               IdSub = 2,
               IsST = true
           }
        }
    },
     new Parent()
    {
        Id = 2,
        ChildrenList = new List<Child>()
        {
           new Child()
           {
               IdSub = 3,
               IsST = false
           },
           new Child()
           {
               IdSub = 4,
               IsST = true
           }
        }
    },
     new Parent()
    {
        Id = 3,
        ChildrenList = new List<Child>()
        {
           new Child()
           {
               IdSub = 5,
               IsST = false
           },
           new Child()
           {
               IdSub = 6,
               IsST = false
           }
        }
    }
};


var parentFilteredList = parentList
            .Select(c => c.ChildrenList
                            .Where(d => d.IsST)
                            .ToList())
            .ToList();

但是parentFilteredList中的父母列表不是List<Parent>类型。

Result_so_far

我需要它是List<Parent>因为在实际情况下, Parent对象以及Child都有很多属性。 Select new选项是不可行的。

有什么帮助吗?

var parentFilteredList = parentList
            .Select(c => c.ChildrenList
                            .Where(d => d.IsST)
                            .ToList())
            .ToList();

在下面的语句中,您正在选择childrenList。

var parentFilteredList = parentList
        .Where(c => c.ChildrenList.Any(d => d.IsST)).ToList();

如果您希望返回所有至少有一个孩子的ST的父母,则-

var parentFilteredList = parentList
     .Where(c => c.ChildrenList.Any(d => d.IsST))
     .ToList();

或者,如果您也要过滤这些父母中的孩子名单,

var parentFilteredList = parentList
     .Where(c => c.ChildrenList.Any(d => d.IsST))
     .Select(c => 
         {
             c.ChildrenList = c.ChildrenList.Where(d => d.IsST).ToList();
             return c;
         }).ToList();

请注意,这会影响您的原父母-我不确定这是否是理想的结果。

基本思想是使用SelectMany ,但根据假设会有一些折衷

基本代码:

var list = parents.SelectMany
(
    p => p.ChildrenList.Where( c => c.IsST )
);

上面假设每个父母有0个或1个匹配的孩子。 如果您要处理父母有两个或多个匹配孩子的情况,则需要以下变体之一。

如果您的父母有两个或多个匹配的孩子,如果您想引发异常:

var list = parents.SelectMany
(
    p => p.ChildrenList.Single( c => c.IsST )
);

如果要排除两个孩子匹配的父母:

var list = parents.SelectMany
(
    p => p.ChildrenList.SingleOrDefault( c => c.IsST )
    ??   Enumerable.Empty<Child>()
);

如果要包括第一个匹配的子项:

var list = parents.SelectMany
(
    p => p.ChildrenList
          .Where( c => c.IsST )
          .Take(1)
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM