我们说我有以下结构,
public class Parent
{
public string Id{get;set;}
public string Name{get;set;}
public List<Child> Children{get;set;}
}
public class Child{
public string Id{get;set;}
public string Name{get;set;}
}
我有一个包含ID List<string>Ids
的字符串列表,以及父母列表List<Parent> parents
。
如何过滤父母以获得以下内容:
因此,如果ids包含父ID,我希望它包含子项,如果它包含子ID,我希望它与其父项(不包括其余子项)。
我尝试了以下操作,并且它正在运行,唯一的问题是如果父ID和子ID都存在,它返回只有一个子节点的父节点,而它应该返回所有子节点。
parents
.Where(p => ids.Contains(p.Id) ||
p.Children.Any(x=>ids.Contains(x.Id)))
.Select(res => new Parent() {
Name = res.Name,
Id = res.Id,
Children = es.Children
.Where(child => ids.Contains(child.Id))
.ToList()
});
答案 0 :(得分:2)
这很难看,但应该适用于你的案件。
var result = parents
.Where(p => ids.Contains(p.Id) || p.Children.Any(x => ids.Contains(x.Id)))
.Select(res => new Parent()
{ Name = res.Name,
Id = res.Id,
Children = res.Children.Any(c => ids.Contains(c.Id)) && !ids.Contains(res.Id)
? res.Children.Where(child => ids.Contains(child.Id)).ToList()
: res.Children.ToList() })
.ToList();
答案 1 :(得分:1)
以下使用字典可能更有效
string[] ids = parents.Select(x => x.Children.Select(y => y.Id)).SelectMany(x => x).OrderBy(x => x).Distinct().ToArray();
Dictionary<string, List<Parent>> dict = new Dictionary<string, List<Parent>>();
foreach (string id in ids)
{
List<Parent> parentId = parents.Where(x => x.Children.Any(y => y.Id == id)).ToList();
dict.Add(id, parentId);
}