![](/img/trans.png)
[英]Searching for an item in a list that's nested inside another list based on a property value in C# using 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>
类型。
我需要它是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.