पदानुक्रमित पेड़ में सी # सूची स्थानांतरित करना

मेरे पास एक सी # सूची है जिसमें फ़ाइल का नाम और वह फ़ोल्डर है जिसके तहत वह फ़ाइल उपलब्ध है।

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

    public class Tree
    {
        public List dataList = new List();


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

        }

    }

मुझे इस सूची को पदानुक्रमित जेसन ऑब्जेक्ट में कनवर्ट करने की आवश्यकता है। आउटपुट इस तरह दिखना चाहिए:

{
            "text": ".",
            children: [{
                task: 'First Child',
                duration: 6.5,
                user: 'Tommy Maintz',
                leaf: true,
                iconCls: 'task'

            }, {
                task: 'Testing',
                duration: 2,
                user: 'Core Team',
                iconCls: 'task-folder',
                children: [{
                    task: 'Testing First Child',
                    duration: 6.5,
                    user: 'Tommy',
                    leaf: true,
                    iconCls: 'task'

                }, {
                    task: 'Mac OSX',
                    duration: 0.75,
                    user: 'Tommy Maintz',
                    iconCls: 'task-folder',
                    children: [{
                        task: 'FireFox',
                        duration: 0.25,
                        user: 'Tommy Maintz',
                        iconCls: 'task',
                        leaf: true
                    }, {
                        task: 'Safari',
                        duration: 0.25,
                        user: 'Tommy Maintz',
                        iconCls: 'task',
                        leaf: true
                    }, {
                        task: 'Chrome',
                        duration: 0.25,
                        user: 'Tommy Maintz',
                        iconCls: 'task',
                        leaf: true
                    }]
                }, {
                    task: 'Windows',
                    duration: 3.75,
                    user: 'Darrell Meyer',
                    iconCls: 'task-folder',
                    children: [{
                        task: 'FireFox',
                        duration: 0.25,
                        user: 'Darrell Meyer',
                        iconCls: 'task',
                        leaf: true
                    }, {
                        task: 'Safari',
                        duration: 0.25,
                        user: 'Darrell Meyer',
                        iconCls: 'task',
                        leaf: true
                    }, {
                        task: 'Chrome',
                        duration: 0.25,
                        user: 'Darrell Meyer',
                        iconCls: 'task',
                        leaf: true
                    }, {
                        task: 'Internet Exploder',
                        duration: 3,
                        user: 'Darrell Meyer',
                        iconCls: 'task',
                        leaf: true
                    }]
                }, {
                    task: 'Linux',
                    duration: 0.5,
                    user: 'Aaron Conran',
                    iconCls: 'task-folder',
                    children: [{
                        task: 'FireFox',
                        duration: 0.25,
                        user: 'Aaron Conran',
                        iconCls: 'task',
                        leaf: true
                    }, {
                        task: 'Chrome',
                        duration: 0.25,
                        user: 'Aaron Conran',
                        iconCls: 'task',
                        leaf: true
                    }]
                }]
            }]
        }

मैं जो कोशिश कर रहा हूं वह है:

  1. Loop over every item in the dataList
  2. Lets take first object in our example Folder Path : Testing\Mac OSX
  3. If the path does not exists create a new json node and add it
  4. So the system will create two nodes First for "Testing" and under it "Mac OSX"
  5. Now Add the file name FireFox Mac OSX
  6. If the node exists just add the file name under that node.
  7. Repeat this for all items

क्या JSON.NET लाइब्रेरी या किसी अन्य लाइब्रेरी का उपयोग करके इसे हासिल करना संभव है ??

धन्यवाद

0
@digEmAll: मेरा मतलब था, JSON.net का उपयोग करके, पहले इसे नोड बनाएं और इसमें बच्चे नोड्स जोड़ें। इस मामले में, पहले जांच करें कि नाम परीक्षण वाला नोड मौजूद है या नहीं, यदि नहीं, तो नोड जोड़ें। अब हम जांच करेंगे कि मैक ओएसएक्स नाम से नोड परीक्षण नोड के तहत मौजूद है या नहीं। ऐसा करने के लिए हमें पहले परीक्षण नोड खोजना होगा। एक बार जब हम उस नोड को पाते हैं तो हम इसके तहत मैक ओएसएक्स को बाल नोड के रूप में जोड़ देंगे। तो JSON.NET नोड खोज क्षमताओं और अन्य नोड के तहत नोड जोड़ने की क्षमता प्रदान करता है
जोड़ा लेखक SharpCoder, स्रोत
@ जिम मिशेल: हालांकि मूल रूप से प्रश्न समान हैं, दूसरे प्रश्न में बहुत अधिक जानकारी है और इसमें अधिक कोड है। मैंने सोचा कि लोगों के लिए इसका पालन करना मुश्किल होगा और इसलिए मैंने यह नया सवाल बनाया है।
जोड़ा लेखक SharpCoder, स्रोत
मुझे सच में संदेह है कि JSON.NET एक सपाट संरचना को एक पदानुक्रमित रूप में बदल सकता है क्योंकि यह केवल एक धारावाहिक होना चाहिए ... तो, सबसे पहले आपको अपने फ्लैट .नेट संरचना को पदानुक्रमित में बदलना होगा और फिर इसे क्रमबद्ध करना होगा ...
जोड़ा लेखक digEmAll, स्रोत
यह प्रश्न आपके पहले के प्रश्न के डुप्लिकेट (अतिरिक्त जानकारी के साथ) है। कृपया अन्य प्रश्न हटाएं।
जोड़ा लेखक Jim Mischel, स्रोत
आम तौर पर आप एक नया पोस्ट करने के बजाय सवाल संपादित करेंगे। यदि उस अन्य प्रश्न में ऐसी जानकारी है जो आपको लगता है कि प्रासंगिक है, तो इसे इस प्रश्न में जोड़ें। लेकिन दूसरे को हटा दें, क्योंकि दोनों की आवश्यकता नहीं है।
जोड़ा लेखक Jim Mischel, स्रोत
@Brownn_Dynamite, यह वास्तव में एक JSON प्रश्न नहीं है, यह एक परिवर्तन प्रश्न है। जेएसओएन सूचियों को बदलने के लिए नहीं है, जैसे कि डिग ने कहा, यह पढ़ने/लिखने के लिए है।
जोड़ा लेखक A.R., स्रोत

2 उत्तर

इस प्रकार हम परिणाम प्राप्त कर सकते हैं

class Node
{
    public Node()
    {
        Children = new List();
    }

    public string Name { get; set; }
    public List Children { get; set; }
}


Dictionary dict = new Dictionary();
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 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);
0
जोड़ा

अपनी संरचना का निम्नलिखित संरचना में अनुवाद करें और जो आपके बाद के जेसन संरचना में क्रमबद्ध किया जा सकता है।

 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 children { get; set; }
        }

        public class Tree
        {
            public string text { get; set; }
            public List children { get; set; }
        }
0
जोड़ा
कुछ चुनौतियां हैं: मैं फ़ोल्डर और उप फ़ोल्डर के लिए नोड्स कैसे बना सकता हूं। विभिन्न स्तरों पर दो फ़ोल्डर का एक ही नाम हो सकता है, मैं कैसे सुनिश्चित कर सकता हूं कि फ़ाइलों को सही नोड के तहत जोड़ा गया है। सबसे प्रभावी तकनीक क्या है। मैं परिवर्तन के कई दौर के बाद परिणाम प्राप्त कर सकता हूं लेकिन मैं सबसे अच्छी तकनीक का उपयोग करना चाहता हूं।
जोड़ा लेखक SharpCoder, स्रोत
मुझे लगता है कि वह अपनी स्रोत सूची को अनदेखा करने के लिए कुछ ढूंढ रहा है।
जोड़ा लेखक A.R., स्रोत