我通过列表有一个自我关联的对象。如何获得父母或个人(没有孩子)的对象列表,而不是父母的孩子的任何项目?
此外,可能会出现父母/子女/大孩子的情况,因此只会选择父母。
这是我的测试对象
public class MyObj
{
public MyObj()
{
MyList = new List<MyObj>();
}
public string Id { get; set; }
public List<MyObj> MyList { get; set; }
}
这是我的代码尝试了一些,两者都导致零项。我也需要使用Id进行比较。
static void Main(string[] args)
{
var parent = new MyObj() {Id = "parent"};
var child = new MyObj() { Id = "child" };
parent.MyList.Add(child);
var person = new MyObj() { Id = "person" };
var list = new List<MyObj>();
list.Add(parent);
list.Add(child);
list.Add(person);
//-- Expected result
// parent
// person
//attempt 1
List<MyObj> all2 = list.Select(sm => sm).ToList();
List<MyObj> x = list.SelectMany(sm => sm.MyList.Except(all2)).ToList();
//attempt2
List<MyObj> parentsAndOphans = list.Where(w => list.All(w2 => list.Find(f => f.Id != w2.Id) == null)).ToList();
}
答案 0 :(得分:3)
假设ID
是唯一的:
var children = new HashSet<string>(list.SelectMany(x => x.MyList.Select(c => c.Id)));
var results = list.Where(x => !children.Contains(x.Id)).ToList();
HashSet
使其成为 O(n)问题。如果你不想使用HashSet
,你可以执行更慢的(可能是 O(n ^ 2))查询:
var results = list.Where(x => !list.Any(c => c.MyList.Contains(x))).ToList();
您还可以向您的班级添加Parent
媒体资源:
public MyObj Parent { get; set; }
并执行简单的Parent == null
检查:
var results = list.Where(x => x.Parent == null).ToList();