DataTable中的嵌套对象

时间:2014-06-04 00:35:25

标签: c# recursion nested

我觉得我在这里偏离轨道。我一直在敲我的键盘,我不觉得我更接近解决方案。非常感谢指导。

Models.Content包含SubContent类型List<Models.Content>的属性。嵌套可以是无限的,应该是递归的。我觉得应该可以通过几行LINQwhile来完成这项工作。我造成了一团糟。

private static List<Models.Content> GetAllContentFromDataSet(DataSet ds)
{
    var content = new List<Models.Content>();
    var contentList = (from DataRow row in ds.Tables[0].Rows
                       select new Models.Content
                       {
                           Id = Convert.ToInt32(row["Id"]),
                           ParentContentId = Convert.ToInt32(row["ParentContentId"]),
                           c3 = Convert.ToString(row["c3"]),
                           c4 = Convert.ToString(row["c4"]),
                           c5 = Convert.ToString(row["c5"])
                       }).ToList();

    content.AddRange(NestContent(contentList));

    return content;
}

private static IEnumerable<Models.Content> NestContent(List<Models.Content> content)
{
    var toBeRemoved = new List<Models.Content>();

    foreach (var c in content)
    {
        var parent = content.FirstOrDefault(p => p.Id == c.ParentContentId);
        if (parent == null) continue;
        parent.SubContent.Add(c);
        toBeRemoved.Add(c);
    }

    foreach (var c in toBeRemoved)
    {
        content.Remove(c);
    }

    return content;
}

2 个答案:

答案 0 :(得分:3)

以下是我要做的一个例子:

// Create a list of all items without children.
var things = table.AsEnumerable()
                  .Select(row => new Thing
                  {
                      Id = row.Field<int>("Id"),
                      ParentId = row.Field<int>("ParentId")
                  })
                  .ToList();

// Add children to each item.
things.ForEach(t1 => t1.Children = things.Where(t2 => t2.ParentId == t1.Id).ToList());

// Create a list of items that don't have a parent..
things = things.Where(t => t.ParentId == 0).ToList();

答案 1 :(得分:0)

我同意,我认为您可以用更少的代码行构建模型层次结构,从而使您的代码更易于维护和阅读。我实际上分两步完成这个......

  1. 首先解析根“内容”(那些ParentContentId == null ...我想)...这可以通过LINQ
  2. 在一行代码中完成
  3. 然后遍历所有子内容行(指定了ParentContentId的行)并将它们“附加”到父内容(如果存在)
  4. 如果您有了想法或者您需要一个示例,请告诉我