【问题标题】:c# parent child list add IDsc#父子列表添加ID
【发布时间】:2025-12-25 22:00:10
【问题描述】:

我有一个以 JSON 格式获取的父子列表

public class Item
{
    public Item()
    {
       this.Items = new List<Item>();
    }

    public string Name { get; set; }
    public DateTime Created { get; set; }
    public string Content { get; set; }
    public string UserId { get; set; }
    List<Item> Items { get; set; }
}

现在想象一下,我得到一个 JSON,我将反序列化为

 string json = "json in here"

 List<Item> listItems = JsonConvert.Dezerialize<List<Item>>(json);

我的问题:我怎样才能解析List&lt;Item&gt; 并动态添加 ID 到它,所以它会是这样的?

public class Item
{
    public Item()
    {
       this.Items = new List<Item>();
    }

    public string Id { get; set; }
    public string ParentId { get; set; }
    public string Name { get; set; }
    public DateTime Created { get; set; }
    public string Content { get; set; }
    public string UserId { get; set; }
    List<Item> Items { get; set; }
}

Id 是项目 Id(例如可以是 Guid),ParentId 是项目的父项的 Id。如果 Item 没有父级,则 ParentId 为空。如果 ParentId 为 null Item 则为*项目。可以有多个父项。

【问题讨论】:

  • 只需使用新属性 ID 更新您的 dto 类,而不是通过设置值更新您的数据并将其序列化。相关:*.com/questions/7472486/…
  • 你是问对象反序列化后如何手动分配ID?递归可行,但你到底想要完成什么?几乎无法保证在任何时候运行相同的 ID 都会应用于相同的实例,因此它们并不能真正标识元素。解决的高阶问题是什么?
  • Name 是唯一的吗?
  • 每个项目都包含一个List&lt;Item&gt; ?这对我来说没有意义。所以每个ItemItems 都包含一个Item(本身)?
  • @cdsln:这是一个树形结构。任何给定节点都有一组子节点。

标签: c# parent-child


【解决方案1】:

例如可以是Guid

很多更容易,因为您不必跟踪已使用的 ID。现在这是一个简单的递归工作:

void SetIDs(Item item, string parentId)
{
    item.ParentId = parentId;
    item.Id = Guid.NewGuid().ToString();
    foreach (var i in item.Items)
        SetIDs(i, item.Id);
}

然后只需使用*项目的初始空 ID 调用它(根据您的要求,*项目具有 null 父 ID):

SetIDs(someItem, null);

(如果您确实必须跟踪 ID,例如使用 int,那么您可能正在查看可能比较棘手的更高范围的变量或 out 参数或类似的东西自然是丑陋的。)

【讨论】: