C# C语言中的类图实现#

C# C语言中的类图实现#,c#,data-structures,C#,Data Structures,所以我有一个对象(我们称之为头部),它有一个对象列表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 其中“->”表示“相关” 我曾想过创建一个以继承者和前辈为属性的类,但不确定如何从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
其中“->”表示“相关”


我曾想过创建一个以继承者和前辈为属性的类,但不确定如何从Head对象构建类似于图的结构?

这实际上取决于您需要对图做什么。最简单的存储是
列表
,其中每个节点对象都包含指向其前辈和后辈的链接。(当然还有一些数据)

您可以完成此列表中的几乎所有操作,但算法可能具有某种数据结构,从而使其更高效/更快。根据需要转换为这个。例如,对于初始化:

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[ from ].Successors.Add(dict[ to ]);
        dict[ to ].Predecessors.Add(dict[ from ]);
    }
}

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;
    }
}
类示例
{
公共列表InitGraph()
{
var节点=新字典();
节点。添加(“头”,新节点(“头”);
添加(“T1”,新节点(“T1”);
节点。添加(“T2”,新节点(“T2”);
//虽然这样做有效,但有一种方法更好:
节点。添加(“C1”);
//这两行代码实际上应该分解为一个方法调用
节点[“Head”]。继承者。添加(节点[“T1”]);
节点[“T1”]。前置。添加(节点[“Head”]);
节点[“Head”]。继任者。添加(节点[“T2”]);
节点[“T2”]。前置。添加(节点[“Head”]);
//是的,好多了
节点。连接(“头”,“C1”);
节点。连接(“T1”、“C1”);
节点。连接(“T2”、“C1”);
var nodelist=新列表(nodes.Values);
返回节点列表;
}
}
公共静态类NodeHelper
{        
公共静态void Add(此字典dict dict,字符串nodename)
{
dict.Add(节点名,新节点(节点名));
}
公共静态void Connect(此字典dict dict、字符串from、字符串to)
{
dict[from].successivers.Add(dict[to]);
dict[to].preventors.Add(dict[from]);
}
}
公共类节点
{
公共字符串名称{get;set;}
公共int凉爽度{get;set;}
公共列表前导{get;set;}
公共列表继承者{get;set;}
公共节点()
{
凉爽度=1;
}
公共节点(字符串名称):this()
{
this.Name=Name;
}
}
对于实际的初始化阶段,我从一个文件中读取它。首先是所有节点,然后是连接它们的所有边。使用一些很好的加载/保存方法,以确保其一致性



虽然我已经扩展了这个示例(并编译了它),但我把测试留给了读者。这应该给你一个很好的起点。

对我来说,你的问题是什么还不清楚。一定有什么东西可以发挥独特的主键作用。创建
字典
并将所有节点放在那里,这样当您创建图形时,您可以检查节点是否已经是它的一部分(并简单地链接到它),或者您必须添加新的一个。是的,这正是我现在拥有的..一个列表,节点<,带有指向前辈和后辈的链接。但是我不知道如何建立这种关系,就像我首先迭代所有C对象的head对象并添加到列表中,然后迭代T/M对象并查找相关的C对象一样?首先添加所有节点。然后,对每条边进行连接。最后,(可选)检查图形的连接。您的连接方法不使用from、to
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[ from ].Successors.Add(dict[ to ]);
        dict[ to ].Predecessors.Add(dict[ from ]);
    }
}

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