自己的 DOT 语言参考结构

Own reference structure to DOT language

我在 C# 中创建决策树,其中节点是对象,分支是引用,我想知道是否可以使用某种工具将此结构更改为 DOT 语言图形以在 graphviz 中使用它? 如果有更好的方法来构建此图?

假设你的节点看起来像这样

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

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

您可以使用此代码创建 dot 文件:

private static void PrintInDotFormat(Node root)
{
    // 1. Create graph
    var nodes = new HashSet<Node>();
    var openList = new Queue<Node>();
    var references = new List<KeyValuePair<Node, Node>>();

    openList.Enqueue(root);
    while (openList.Count > 0)
    {
        var current = openList.Dequeue();
        nodes.Add(current);
        foreach (var child in current.ChildNodes)
        {
            references.Add(new KeyValuePair<Node, Node>(current, child));

            if (nodes.Contains(child))
                continue;
            openList.Enqueue(child);
        }
    }

    // 2. Print it to console
    Console.WriteLine("digraph DecisionTree {");
    foreach (var node in nodes)
        Console.Write($"{node.Name};");

    Console.WriteLine();

    foreach (var pair in references)
        Console.WriteLine($"{pair.Key.Name}->{pair.Value.Name};");

    Console.WriteLine("}");
}

用法:

var root = new Node("root");
root.ChildNodes.Add(new Node("a"));
root.ChildNodes.Add(new Node("b"));
root.ChildNodes.Add(new Node("c"));

PrintInDotFormat(root);

此代码将以 dot 文件格式打印图表:

digraph DecisionTree {
root;a;b;c;
root->a;
root->b;
root->c;
}

dot.exe处理后: