将C#列表转换为层次树

将C#列表转换为层次树,c#,json,data-structures,tree,json.net,C#,Json,Data Structures,Tree,Json.net,我有一个C#列表,其中包含文件名和该文件所在的文件夹 public class Data { public string Name { get; set; } public string Folder { get; set; } } public class Tree { public List<Data> dataList = new List<Data>(); pub

我有一个C#列表,其中包含文件名和该文件所在的文件夹

public class Data
    {
        public string Name { get; set; }
        public string Folder { get; set; }
    }

    public class Tree
    {
        public List<Data> dataList = new List<Data>();


        public Tree()
        {
            Data d = new Data();
            d.Name = "FireFox";
            d.Folder = @"Testing\Mac OSX";
            dataList.Add(d);

            d = new Data();
            d.Name = "Safari";
            d.Folder = @"Testing\Mac OSX";
            dataList.Add(d);

            d = new Data();
            d.Name = "Chrome";
            d.Folder = @"Testing\Mac OSX";
            dataList.Add(d);

            d = new Data();
            d.Name = "FireFox";
            d.Folder = @"Testing\Windows";
            dataList.Add(d);

            d = new Data();
            d.Name = "Safari";
            d.Folder = @"Testing\Windows";
            dataList.Add(d);

            d = new Data();
            d.Name = "Chrome";
            d.Folder = @"Testing\Windows";
            dataList.Add(d);

            d = new Data();
            d.Name = "Internet Exploder";
            d.Folder = @"Testing\Windows";
            dataList.Add(d);


            d = new Data();
            d.Name = "Chrome";
            d.Folder = @"Testing\Linux";
            dataList.Add(d);

            d = new Data();
            d.Name = "Firefox";
            d.Folder = @"Testing\Linux";
            dataList.Add(d);

            d = new Data();
            d.Name = "Testing First Child";
            d.Folder = @"Testing";
            dataList.Add(d);

            d = new Data();
            d.Name = "First Child";
            d.Folder = null;
            dataList.Add(d);

        }

    }
我想做的是:

  • 循环数据列表中的每个项
  • 让我们以示例中的第一个对象为例
    文件夹路径:Testing\Mac OSX
  • 如果路径不存在,则创建一个新的json节点并添加它
  • 因此,系统将创建两个节点,第一个用于“测试”,第二个用于“MacOSX”
  • 现在添加文件名FireFox Mac OSX
  • 如果该节点存在,只需在该节点下添加文件名
  • 对所有项目重复此操作
  • 是否可以使用JSON.NET库或任何其他库来实现这一点


    谢谢

    将您的结构转换为以下结构,并且应该能够序列化为您想要的Json结构

     public class Child
            {
                public string task { get; set; }
                public double duration { get; set; }
                public string user { get; set; }
                public bool leaf { get; set; }
                public string iconCls { get; set; }
                public List<Child> children { get; set; }
            }
    
            public class Tree
            {
                public string text { get; set; }
                public List<Child> children { get; set; }
            }
    
    公共类子类
    {
    公共字符串任务{get;set;}
    公共双持续时间{get;set;}
    公共字符串用户{get;set;}
    公共布尔叶{get;set;}
    公共字符串iconCls{get;set;}
    公共列表子项{get;set;}
    }
    公共类树
    {
    公共字符串文本{get;set;}
    公共列表子项{get;set;}
    }
    
    这就是我们如何实现结果的方法

    class Node
    {
        public Node()
        {
            Children = new List<Node>();
        }
    
        public string Name { get; set; }
        public List<Node> Children { get; set; }
    }
    
    
    Dictionary<string, string> dict = new Dictionary<string, string>();
    dict.Add("Kitchen supplies", "Shopping / Housewares");
    dict.Add("Groceries", "Shopping / Housewares");
    dict.Add("Cleaning supplies", "Shopping / Housewares");
    dict.Add("Office supplies", "Shopping / Housewares");
    dict.Add("Retile kitchen", "Shopping / Remodeling");
    dict.Add("Ceiling", "Shopping / Remodeling / Paint bedroom");
    dict.Add("Walls", "Shopping / Remodeling / Paint bedroom");
    dict.Add("Misc", null);
    dict.Add("Other", "Shopping / Remodeling");
    
    Node root = new Node();
    foreach (KeyValuePair<string, string> kvp in dict)
    {
        Node parent = root;
        if (!string.IsNullOrEmpty(kvp.Value))
        {
            Node child = null;
            foreach (string part in kvp.Value.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries))
            {
                string name = part.Trim();
                child = parent.Children.Find(n => n.Name == name);
                if (child == null)
                {
                    child = new Node { Name = name };
                    parent.Children.Add(child);
                }
                parent = child;
            }
        }
        parent.Children.Add(new Node { Name = kvp.Key });
    }
    
    //Using JSON.NET
     string output = JsonConvert.SerializeObject(root);
    
    类节点
    {
    公共节点()
    {
    Children=新列表();
    }
    公共字符串名称{get;set;}
    公共列表子项{get;set;}
    }
    Dictionary dict=新字典();
    添加(“厨房用品”、“购物/家庭用品”);
    添加(“食品杂货”、“购物/家庭用品”);
    添加(“清洁用品”、“购物/家庭用品”);
    dict.Add(“办公用品”、“购物/家庭用品”);
    添加(“Retile厨房”、“购物/改造”);
    添加(“天花板”、“购物/改建/粉刷卧室”);
    添加(“墙壁”、“购物/改造/粉刷卧室”);
    dict.Add(“杂项”,空);
    添加(“其他”、“购物/改造”);
    节点根=新节点();
    foreach(dict中的KeyValuePair kvp)
    {
    节点父节点=根节点;
    如果(!string.IsNullOrEmpty(kvp.Value))
    {
    节点子节点=null;
    foreach(kvp.Value.Split中的字符串部分(新字符[]{'/'},StringSplitOptions.RemoveEmptyEntries))
    {
    字符串名称=part.Trim();
    child=parent.Children.Find(n=>n.Name==Name);
    if(child==null)
    {
    子节点=新节点{Name=Name};
    parent.Children.Add(child);
    }
    父母=子女;
    }
    }
    Add(新节点{Name=kvp.Key});
    }
    //使用JSON.NET
    字符串输出=JsonConvert.SerializeObject(根);
    
    我真的怀疑JSON.NET能否将平面结构转变为层次结构,因为它应该只是一个序列化程序。。。因此,首先您需要将平面.net结构转换为层次结构,然后将其序列化…@digEmAll:我的意思是,使用JSON.net,首先创建一个节点并向其添加子节点。在这种情况下,首先检查是否存在名为Testing的节点,如果不存在,则添加该节点。现在,我们将检查测试节点下是否存在名为macosx的节点。要做到这一点,我们首先需要搜索测试节点。一旦找到该节点,我们将在其下添加macosx作为子节点。那么JSON.NET是否提供了节点搜索功能&能够在另一个节点下添加节点node@Brownn_Dynamite,这不是一个真正的JSON问题,而是一个转换问题。JSON不是用来转换列表等,就像dig说的,它是用来读/写的。这个问题是重复的(添加了信息)。请删除另一个问题。@JimMischel:虽然问题基本相同,但另一个问题有更多的信息和代码。我认为人们很难理解这一点,这就是我提出这个新问题的原因。我认为他正在寻找一些东西来取消其源列表的扁平化。没有什么挑战:如何为文件夹和子文件夹创建节点。不同级别的两个文件夹可以具有相同的名称,如何确保文件添加到正确的节点下。最有效的技术是什么。我可以在几轮转换后获得结果,但我想使用最好的技术。
    class Node
    {
        public Node()
        {
            Children = new List<Node>();
        }
    
        public string Name { get; set; }
        public List<Node> Children { get; set; }
    }
    
    
    Dictionary<string, string> dict = new Dictionary<string, string>();
    dict.Add("Kitchen supplies", "Shopping / Housewares");
    dict.Add("Groceries", "Shopping / Housewares");
    dict.Add("Cleaning supplies", "Shopping / Housewares");
    dict.Add("Office supplies", "Shopping / Housewares");
    dict.Add("Retile kitchen", "Shopping / Remodeling");
    dict.Add("Ceiling", "Shopping / Remodeling / Paint bedroom");
    dict.Add("Walls", "Shopping / Remodeling / Paint bedroom");
    dict.Add("Misc", null);
    dict.Add("Other", "Shopping / Remodeling");
    
    Node root = new Node();
    foreach (KeyValuePair<string, string> kvp in dict)
    {
        Node parent = root;
        if (!string.IsNullOrEmpty(kvp.Value))
        {
            Node child = null;
            foreach (string part in kvp.Value.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries))
            {
                string name = part.Trim();
                child = parent.Children.Find(n => n.Name == name);
                if (child == null)
                {
                    child = new Node { Name = name };
                    parent.Children.Add(child);
                }
                parent = child;
            }
        }
        parent.Children.Add(new Node { Name = kvp.Key });
    }
    
    //Using JSON.NET
     string output = JsonConvert.SerializeObject(root);