所以我有一个对象(让我们称之为Head),它有一个对象列表C(C1,C2,C3,...),T(T1,T2,...)和M(M1,M2) ,...)所有这些都是相互关联的,例如
Head -> C1,C2,C3 , T1 , T2 , M1 , M2
T1 -> C1,C2
T2 -> C2,C3
M1 -> C1, C2,C3
M2 -> C1, C2
其中“ - >”暗示“与......有关”
So Head has 7 successors and 0 predecessors
T1 has 1 predecessor(Head ) and 2 successors(C1,C2)
M1 has 1 predecessor(Head ) and 3 successors(C1,C2,C3)
and so on
我想过创建一个以后继者和前辈为属性的类,但是我不确定如何从Head对象构建这个图形结构?
答案 0 :(得分:2)
这实际上取决于您需要对图表执行的操作。最简单的存储是List<Node>
,其中每个Node对象包含指向其前任和后继的链接。 (当然还有一些数据)
您可以在此列表中执行几乎所有操作,但算法可能具有某种数据结构,从而使其更高效/更快。根据需要转换为此。对于初始化,例如:
class Example
{
public List<Node> InitGraph()
{
var nodes = new Dictionary<string, Node>();
nodes.Add("Head", new Node("Head"));
nodes.Add("T1", new Node("T1"));
nodes.Add("T2", new Node("T2"));
// While that works, a method is nicer:
nodes.Add("C1");
// These two lines should really be factored out to a single method call
nodes["Head"].Successors.Add(nodes["T1"]);
nodes["T1"].Predecessors.Add(nodes["Head"]);
nodes["Head"].Successors.Add(nodes["T2"]);
nodes["T2"].Predecessors.Add(nodes["Head"]);
// Yes. Much nicer
nodes.Connect("Head", "C1");
nodes.Connect("T1", "C1");
nodes.Connect("T2", "C1");
var nodelist = new List<Node>(nodes.Values);
return nodelist;
}
}
public static class NodeHelper
{
public static void Add(this Dictionary<string, Node> dict, string nodename)
{
dict.Add(nodename, new Node(nodename));
}
public static void Connect(this Dictionary<string, Node> dict, string from, string to)
{
dict["Head"].Successors.Add(dict["T2"]);
dict["T2"].Predecessors.Add(dict["Head"]);
}
}
public class Node
{
public string Name { get; set; }
public int Coolness { get; set; }
public List<Node> Predecessors { get; set; }
public List<Node> Successors { get; set; }
public Node()
{
Coolness = 1;
}
public Node(string name) : this()
{
this.Name = name;
}
}
对于实际的初始化阶段,我会从文件中读取它。首先是所有节点,然后是连接它们的所有边缘。制作一些不错的加载/保存方法,以确保它们一致。
虽然我已经扩展了示例(并且它编译了),但我还是向读者留下了测试。它应该给你一个很好的起点。