如何在没有子项的linq的递归列表中获取父母和人员列表?

时间:2014-01-16 02:36:31

标签: c# linq

我通过列表有一个自我关联的对象。如何获得父母或个人(没有孩子)的对象列表,而不是父母的孩子的任何项目?

此外,可能会出现父母/子女/大孩子的情况,因此只会选择父母。

这是我的测试对象

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();


}

1 个答案:

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