[英]On how to properly use the following classes on graphs in C#
目前,我正在嘗試通過實現各種算法來學習C#
。 我問了一個有關如何用C#
表示圖形的問題 ,用戶michaelb建議使用類。 我嘗試在以下代碼中使用這些類構造一個圖形。
我習慣於具有構造函數的類,可以在其中設置要創建的對象的字段,但是這些類似乎僅具有默認的無參數構造函數。 我有三個問題:
類中的“實體”是否是偶數字段,例如public Node From;
在Edge
類中構成一個字段?
Edge
和Node
類相互引用不是很奇怪嗎? 它看起來像兩個自引用循環,其中它們是相互定義的。
當我嘗試運行代碼時,在步驟G.Nodes.Add(v1);
收到錯誤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-這些類都不包含“定義”或“事物”。 它們僅包含引用 。 很好。 想一想通常的TreeNode
類,它本身包含一個List<Node> Nodes
和一個Node ParentNode
..自引用 ,是的,正如您最初注意到的是null
,但沒有問題。
3-是的,對於這些類,默認構造函數確實有些破舊。 因此,您會丟失List<T>
字段的實例化。 要么添加這個
Graph G = new Graph();
..
G.Nodes = new List<Node>(); // <<<---
G.Nodes.Add(v1);
..etc,或者通過提供缺少行的真正的構造函數來改進類!
public Graph() {Nodes = new List<Node>();}
構造函數的設計方式以及您編寫的構造函數的數量再次取決於您以及您想要/需要/喜歡什么。
關於錯誤,缺少G.Nodes = new List<Node>(); G.Nodes.Add(v1); G.Nodes.Add(v2); G.Nodes.Add(v3);
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
引用,但這不是問題,因為在創建此類對象時,程序會將空引用放置在列表和類的前面。
程序員必須創建新對象並指向這些對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.