首页 > 解决方案 > c#在嵌套的对象列表中插入项目

问题描述

我有这样的课:

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. 编号 = 4
  2. Abc 类的对象 (Id = 9)
  3. Abc 类的对象 (Id = 11)

我需要在整个列表中找出 id 为 4 的对象,并且仅当列表中不存在该对象时才将该对象插入其子项中。

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

=== UPDATE 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 或任何其他方法。

标签: c#listlinqlambdanested

解决方案


当然,您可以检查 Child 属性不为 null 的位置。

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

推荐阅读