C#将列表转换为层次结构

时间:2017-07-19 09:03:12

标签: c# list hierarchy

Hej hej,

我目前正在开发一个c#wpf项目,我希望从一个线性的Items列表中动态填充TreeView。

我的出发点是关于codeproject的这篇文章:

https://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode

John Smith展示了如何使用带有TreeViews的HierarchalDataTemplate。到目前为止,这是有效的。我的问题是从一个线性项目列表动态生成一个分层树。我试图调整这里找到的解决方案

Mapping a flat list to a hierarchical list with parent IDs C#

在这里

TreeView directories in C# WPF

但不知怎的,我没有成功。

我的项目类看起来像这样:

public class Item
{
    public string Name { get; set; }

    public ItemPath[] ParentPath { get; set; }      

    public ItemPath[] Path { get; set; }
}

ItemPath类

public class ItemPath
{
    public int Level { get; set; }
    public string Name { get; set; }
}

目标层次结构

public class ItemTree
{
    public string Name { get; set; }

    public Item Item { get; set; }

    public List<ItemTree> ChildTree { get; set; }
}

我正在使用此平面列表来测试我的方法:

var items = new List<Item>()
{
    new Item()
    {
        Name = "item 0",
        Path = new ItemPath[]
        {
            new ItemPath() { Name = "Red", Level = 1 },
        }
    },
    new Item()
    {
        Name = "item 1",
        Path = new ItemPath[]
        {
            new ItemPath() { Name = "Red", Level = 1 },
            new ItemPath() { Name = "Green", Level = 2 },
        }
    },
    new Item()
    {
        Name = "item 2",
        Path = new ItemPath[]
        {
            new ItemPath() { Name = "Red", Level = 1 },
            new ItemPath() { Name = "Violet", Level = 2 },
        }
    },
    new Item()
    {
        Name = "item 3",
        Path = new ItemPath[]
        {
            new ItemPath() { Name = "Blue", Level = 1 },
            new ItemPath() { Name = "Black", Level = 2 },
        }
    },
    new Item()
    {
        Name = "item 4",
        Path = new ItemPath[]
        {
            new ItemPath() { Name = "Blue", Level = 1 },
            new ItemPath() { Name = "Green", Level = 2 },
        }
    },
    new Item()
    {
        Name = "item 5",
        Path = new ItemPath[]
        {
            new ItemPath() { Name = "Red", Level = 1  },
            new ItemPath() { Name = "Green", Level = 2 },
        }
    },
};

我的目标是拥有像这样的层次结构

  • [红色]
    • 第0项
    • [绿色]
      • 第1项
      • 第5项
    • [紫]
      • 第2项
  • [蓝色]
    • [黑白]
      • 第2项
    • [绿色]
      • 第4项

我目前的尝试如下。它是上面的stackoverflow帖子的重写版本:

// class to create dummy data as described above
var dummyData = new DummyData();
var items = dummyData.CreateTier2DummyList();

var cat = items.Select(r => new ItemTree()
{
    Path = r.Path,
    Item = r,
    // parent path is generated dynamically
    ParentPath = r.Path.Reverse().Skip(1).Reverse().ToArray(),
}).ToList();

var lookup = cat.ToLookup(c => c.ParentPath);

foreach (var c in cat)
{
    if (lookup.Contains(c.Path))
        c.ChildTree = lookup[c.ParentPath].ToList();
}

不知何故,我认为使用数组作为路径和父路径并不是一个好主意。但它反映了绝对路径(与文件系统中的文件路径相当)。

0 个答案:

没有答案