自己的 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
处理后:
我在 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
处理后: