关于如何在C#中正确地在图上使用以下类

本文关键字:于如何 正确地 | 更新日期: 2023-09-27 18:20:07

目前,我正在尝试通过实现各种算法来学习C#。我问了这个关于如何在C#中表示图的问题,用户michaelb建议使用类。我试图在下面的代码中用这些类构造一个图。

我习惯了有构造函数的类,在构造函数中我可以设置我正在创建的对象的字段,但这些类似乎只有默认的无参数构造函数。我有三个问题:

类中的"实体"是偶数字段吗?例如,public Node From;是否构成Edge类中的字段?

EdgeNode这两个类互相引用,这不是很奇怪吗?它看起来像一个双重的自我参照循环,在这个循环中,它们是根据彼此来定义的。

当我尝试运行我的代码时,我在步骤G.Nodes.Add(v1);处得到错误,即System.NullReferenceException。我做错了什么,使用这些类的正确方法是什么?

谢谢。

using System;
using System.Collections.Generic;
class Program
{
    static void Main(string[] args)
    {
        Graph G = new Graph();
        Node v1 = new Node();
        Node v2 = new Node();
        Node v3 = new Node();
        G.Nodes.Add(v1);
        G.Nodes.Add(v2);
        G.Nodes.Add(v3);
        Edge e1 = new Edge();
        Edge e2 = new Edge();
        e1.From = v1;
        e1.To = v2;
        e2.From = v2;
        e2.To = v3;
        v1.EdgesOut.Add(e1);
        v1.EdgesIn.Add(e1);
        v2.EdgesOut.Add(e2);
        v3.EdgesIn.Add(e2);
        Console.WriteLine(G);
        Console.ReadKey();
    }
}
class Edge
{
    public Node From;
    public Node To;
}
class Node
{
    public List<Edge> EdgesIn;
    public List<Edge> EdgesOut;
}
class Graph
{
    public List<Node> Nodes;
}

关于如何在C#中正确地在图上使用以下类

1-字段是否为公共字段,甚至是否设计为属性,都取决于您自己。但是,是的,它们是字段或成员。

2-不,这些类既不包含"definitions"也不包含"things"。它们只是包含引用。非常好。想想通常的TreeNode类,它本身包含一个List<Node> Nodes和一个Node ParentNode。。自我参考,是的,正如您最初注意到的null,但没有问题。

3-是的,默认构造函数对于那些类来说确实有点破旧。因此,您将错过List<T>字段的实例化。要么添加此

  Graph G = new Graph();
  ..
  G.Nodes = new List<Node>();  //  <<<---
  G.Nodes.Add(v1);

等等,或者通过提供一个带有缺失行的真正构造函数来改进类!

public Graph() {Nodes = new List<Node>();}

构造函数是如何设计的,以及你写了多少,都取决于你自己和你想要/需要/喜欢什么。。

关于错误,缺少G.Nodes = new List<Node>(); G.Nodes.Add(v1); G.Nodes.Add(v2); G.Nodes.Add(v3);

v1.EdgesOut = new List<Edge>(); v1.EdgesOut.Add(e1);

以下同上

From构成Edge类中的字段

public仅用于可访问

是的,EdgeNode相互引用,但这不是问题,因为在创建这样的对象时,程序会将空引用放在列表和类的前面。

程序员必须创建新对象并指向这些对象。