关于如何在C#中正确地在图上使用以下类
本文关键字:于如何 正确地 | 更新日期: 2023-09-27 18:20:07
目前,我正在尝试通过实现各种算法来学习C#
。我问了这个关于如何在C#
中表示图的问题,用户michaelb建议使用类。我试图在下面的代码中用这些类构造一个图。
我习惯了有构造函数的类,在构造函数中我可以设置我正在创建的对象的字段,但这些类似乎只有默认的无参数构造函数。我有三个问题:
类中的"实体"是偶数字段吗?例如,public Node From;
是否构成Edge
类中的字段?
Edge
和Node
这两个类互相引用,这不是很奇怪吗?它看起来像一个双重的自我参照循环,在这个循环中,它们是根据彼此来定义的。
当我尝试运行我的代码时,我在步骤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;
}
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
仅用于可访问
是的,Edge
和Node
相互引用,但这不是问题,因为在创建这样的对象时,程序会将空引用放在列表和类的前面。
程序员必须创建新对象并指向这些对象。