C#Complex Linq-如何获取其id或子ID匹配的对象

时间:2018-04-02 06:43:38

标签: c# linq

我们说我有以下结构,

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。 如何过滤父母以获得以下内容:

  • 父ID,其ID包含在所有子项中。
  • 只有ID包含在ID及其父级中的子项。

因此,如果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()
   });

2 个答案:

答案 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);
            }