c#在嵌套对象列表中插入项目

时间:2018-08-16 12:26:18

标签: c# list linq lambda nested

我有这样的课:

public class Abc
{   
    public int Id { get; set; }
    public List<Abc> Child{ get; set; }
}

我有一个 Abc 的嵌套列表,其中有两个父项及其子级:

Abc (Id = 1)
|
|-- Abc (Id = 2)
|-- Abc (Id = 3)
     |
     |-- Abc (Id = 4)
          |
          |-- Abc (Id =5)
Abc (Id = 6)
|
|-- Abc (Id = 7)
|-- Abc (Id = 8)
     |
     |-- Abc (Id = 9)
          |
          |-- (Id = 10)

====更新====

现在,我有两个输入参数:

  1. Id = 4
  2. Abc类(Id = 9)的对象
  3. Abc类(Id = 11)的对象

我需要在整个列表中找出ID为4的对象,并且仅在该对象不存在于列表中的情况下才将该对象插入其子对象中。

所以id = 9已经存在,所以我不能插入。但是我可以插入ID = 11的对象。

===更新2 ====
因此,在添加id = 11之后,列表应如下所示。

Abc (Id = 1)
|
|-- Abc (Id = 2)
|-- Abc (Id = 3)
     |
     |-- Abc (Id = 4)
          |
          |-- Abc (Id =5)
          |-- Abc (Id = 11) -- ADDED
Abc (Id = 6)
|
|-- Abc (Id = 7)
|-- Abc (Id = 8)
     |
     |-- Abc (Id = 9)
          |
          |-- (Id = 10)

我不知道该如何实现。 有人可以帮忙吗?可以是c#lambda或linq或任何其他方法。

3 个答案:

答案 0 :(得分:2)

当然,您需要检查Child属性是否不为空。

public class Abc
{
    public Abc(int id)
    {
        Id = id;
    }

    public int Id { get; }
    public List<Abc> Child { get; set; }

    public Abc FindById(int id)
    {
        if (Id == id) return this;
        if (Child == null) return null;

        foreach (var childItem in Child)
        {
            var result = childItem.FindById(id);
            if (result != null) return result;
        }

        return null;
    }

    public bool HasChild(int id)
    {
      return FindById(id) != null;
    }

    public Abc AddChildIfNotExist(Abc child)
    {
        if (child == null) return this;
        if (!HasChild(child.Id))Child.Add(child);
        return this;
    }
}

    static void Main(string[] args)
    {

        var a = new Abc(1)
        {
            Child = new List<Abc>
            {
                new Abc(2),
                new Abc(3)
                {
                    Child = new List<Abc>
                    {
                        new Abc(7)
                        {
                            Child = new List<Abc>
                            {
                                new Abc(5)
                            }
                        }
                    }
                },
                new Abc(6)
                {
                    Child = new List<Abc>
                    {
                        new Abc(8)
                        {
                            Child = new List<Abc>
                            {
                                new Abc(9),
                                new Abc(4)
                                {
                                   Child = new List<Abc>()
                                }
                            }
                        }
                    }
                }
            }
        };

        a
            .FindById(4)
            .AddChildIfNotExist(new Abc(10))
            .AddChildIfNotExist(new Abc(4));
    }

答案 1 :(得分:0)

尝试递归,应该可以正常工作。在每个成员处检查其ID。如果是您想要的ID,只需将对象插入其子对象即可。如果不是,请检查是否有孩子。如果不是,请转到下一个元素。如果是这样,请以与检查当前成员相同的方式检查子节点(这是递归的来源)。

为了练习,您可以自己编写代码。随时询问它是否不起作用。

答案 2 :(得分:0)

类似的方法应该起作用:

public void findIndex(Abc myClass)
{
    if(myClass.Id == 4)
    {
        //Insert the new item here in the children childs
    }
    else
    {
        Foreach(Abc children in myClass.Child)
        {
            findIndex(children)
        }
    }
}