我希望过滤具有子/子关系的列表。 我已尝试使用SelectMany / Where / Any来做到这一点,但结果包括不符合儿童状况的列表。
var filteredGrandadList = new List<Grandad>();
UnfilteredGrandList.ForEach(grandad =>
{
var filteredGrandad = new Grandad
{
Id = grandad.Id,
Name = grandad.Name,
DadList = new List<Dad>()
};
grandad.DadList.ForEach(dad =>
{
var filteredDad = new Dad
{
Id = dad.Id,
Name = dad.Name,
Type = dad.Type,
ChildList = new List<Child>()
};
dad.ChildList.ForEach(child =>
{
var exists =
child.LastName.Equals("Poe")
;
if (exists)
filteredDad.ChildList.Add(child);
});
if (filteredDad.ChildList.Any())
filteredGrandad.DadList.Add(filteredDad);
});
if (filteredGrandad.DadList.Any())
filteredGrandadList.Add(filteredGrandad);
});
有什么想法?.. 提前完成。
答案 0 :(得分:1)
嗯,可以在一个语句中完成所有操作:
var query = UnfilteredGrandadList.Select(grandad =>
new Grandad
{
Id = grandad.Id,
// etc
DadList = grandad.DadList.Select(dad =>
new Dad
{
Id = dad.Id,
// etc
ChildList = dad.ChildList
.Where(child => child.LastName.Equals("Poe"))
.ToList()
}).Where(dad => dad.ChildList.Any()).ToList()
}).Where(gd => gd.DadList.Any()).ToList();
因此,对于每个爷爷,你建立一个爸爸序列,其中包含一个过滤的孩子列表(按姓氏过滤),然后过滤该爸爸序列,只包含至少有一个孩子的爸爸,然后转结果列表。
然后,您可以按照父亲列表中至少有一个爸爸(现在至少有一个孩子)的格式过滤生成的爷爷 - 再次将结果序列转换为列表。
这不是很漂亮,不可否认......但我现在无法想到任何清洁......