1

階層データを表し、ハイフンで区切られた文字列のリストがあります (3 つのハイフンは区切りを示します)。このリストを JSON 文字列に変換して、ツリー コントロールにバインドできるようにしようとしています。

C# の例を探しています。

リストは次のようになります (リストは完全なリストではなく、場合によっては 7 つのノードの深さがある場合もありますが、アイデアを得ることができます)。

Automotive Electronics
Automotive Electronics---Body Electronics
Automotive Electronics---Body Electronics---Access Control Systems
Automotive Electronics---Body Electronics---Body Control Modules
Automotive Electronics---Driver Information
Automotive Electronics---Driver Information---Clocks
Automotive Electronics---Driver Information---Compass Systems
Automotive Electronics---HomeL
Automotive Electronics---Infotainment & Connectivity
Automotive Electronics---Infotainment & Connectivity---Handsfree Systems
Automotive Interiors
Automotive Interiors---Door Panels
Automotive Interiors---Floor Consoles
Automotive Interiors---Headliners & Overhead Systems
Automotive Interiors---Overhead Consoles
Automotive Seating
Automotive Seating---Complete Seats
Automotive Seating---Complete Seats---SuperThin Seats
4

1 に答える 1

0

主なトリックは、文字列をツリー構造にすることです。次のコードスニペット(linqpad)はそれを行います。そのままの出力がクライアント側で処理できるものかどうかはわかりませんが、自分に合ったものに変更できるはずです。

void Main()
{
    var rootNode = new Node("root");
    foreach(string s in new[] {"Automotive Electronics",
        "Automotive Electronics---Body Electronics",
        "Automotive Electronics---Body Electronics---Access Control Systems",
        "Automotive Electronics---Body Electronics---Body Control Modules",
        "Automotive Electronics---Driver Information",
        "Automotive Electronics---Driver Information---Clocks",
        "Automotive Electronics---Driver Information---Compass Systems",
        "Automotive Electronics---HomeL",
        "Automotive Electronics---Infotainment & Connectivity",
        "Automotive Electronics---Infotainment & Connectivity---Handsfree Systems",
        "Automotive Interiors",
        "Automotive Interiors---Door Panels",
        "Automotive Interiors---Floor Consoles",
        "Automotive Interiors---Headliners & Overhead Systems",
        "Automotive Interiors---Overhead Consoles",
        "Automotive Seating",
        "Automotive Seating---Complete Seats",
        "Automotive Seating---Complete Seats---SuperThin Seats"})
    {
        AddNodes(rootNode, s.Split(new[] {"---"}, StringSplitOptions.RemoveEmptyEntries));
    }
    new JavaScriptSerializer().Serialize(rootNode.Nodes).Dump();
}

public void AddNodes( Node parentNode, string[] names)
{
    if (names.Any())
    {
        var node = parentNode.AddNode(names.First());
        AddNodes(node, names.Skip(1).ToArray());
    }
}

public class Node
{
    public Node(string name)
    {
        Name = name;
        Nodes = new List<Node>();
    }

    public Node AddNode(string name)
    {
        if (!this.Nodes.Select(n => n.Name).Contains(name.Trim()))
        {
            //name.Dump(this.Name);
            this.Nodes.Add(new Node(name.Trim()));
        }
        return this.Nodes.Where (n => n.Name == name).First();
    }

    public string Name { get;set;}
    public List<Node> Nodes { get; set; }
}

出力:

[{"Name": "Automotive Electronics"、 "Nodes":[{"Name": "Body Electronics"、 "Nodes":[{"Name": "Access Control Systems"、 "Nodes":[]}、 {"Name": "Body Control Modules"、 "Nodes":[]}]}、{"Name": "Driver Information"、 "Nodes":[{"Name": "Clocks"、 "Nodes":[ ]}、{"Name": "Compass Systems"、 "Nodes":[]}]}、{"Name": "HomeL"、 "Nodes":[]}、{"Name":"インフォテインメントと接続性" 、"Nodes":[{"Name": "Handsfree Systems"、 "Nodes":[]}]}]}、{"Name": "Automotive Interiors"、 "Nodes":[{"Name": "Door Panels "、" Nodes ":[]}、{" Name ":"フロアコンソール"、"ノード ":[]}、{"名前 ":"ヘッドライナーとオーバーヘッドシステム "、"ノード ":[]}、{"名前 ":"オーバーヘッドコンソール "、"ノード ":[]}] }、{"Name": "Automotive Seating"、 "Nodes":[{"Name": "Complete Seats"、 "Nodes":[{"Name": "SuperThin Seats"、 "Nodes":[]}] }]}]

JavaScriptSerializerこのスニペットを実行するには、linqpadにいくつかの名前空間をインポートする必要があることに注意してください)。

于 2012-10-17T21:57:44.197 に答える