我有多个对象(节点),每个节点都有一个名为Calea的列表的getter和setter,其中包含其他节点,每个节点也有邻居,它们也是节点。问题是列表堆积起来,我无法弄清楚原因,它就像一个静态变量,而且我也没有在其他任何地方使用getter和setter。 这是我的代码:
private int cost = 10000;
private LinkedList<GraphNode<string>> calea=new LinkedList<GraphNode<string>>() ;
public int Cost
{
get
{
return cost;
}
set
{
cost = value;
}
}
public LinkedList<GraphNode<string>> Calea
{
get
{
if (calea == null) return new LinkedList<GraphNode<string>>();
return calea;
}
set
{
calea = value;
}
}
上面的代码显示了Cost和Calea的方法,Cost工作正常,但Calea正在堆叠。下面的代码是我为每个节点设置值Calea的代码示例:
if (curr.Neighbors.ElementAt(i).Cost > curr.Costs.ElementAt(i) + curr.Cost)
{
curr.Neighbors.ElementAt(i).Cost = curr.Costs.ElementAt(i) + curr.Cost;
curr.Neighbors.ElementAt(i).Calea = curr.Calea;
curr.Neighbors.ElementAt(i).Calea.AddLast((GraphNode<string>)curr.Neighbors.ElementAt(i));
index = i;
}
++i;
我在下面更改当前节点的示例代码:
pathNodesToVisit.Remove(curr);
if (pathNodesToVisit.Count == 0) break;
if (curr.Neighbors.Count > index)
{
for (int j = 0; j < pathNodesToVisit.Count; j++)
{
if (pathNodesToVisit.ElementAt(j).Value == curr.Neighbors.ElementAt(index).Value)
{
indexx = j;
//MessageBox.Show(pathNodesToVisit.ElementAt(j).Value);
}
}
curr = pathNodesToVisit.ElementAt(indexx);
}
else
{
curr = pathNodesToVisit.ElementAt(0);
}
几句话:pathNodesToVisit是我想要访问的所有点头(Dijkstra算法),在上面的代码中我从列表中删除了curr节点,新的curr节点是一个已经更改了Costs和Calea的节点。
答案 0 :(得分:0)
我不明白你的意思&#34;堆积,&#34;但是:
public LinkedList<GraphNode<string>> Calea
{
get
{
if (calea == null) return new LinkedList<GraphNode<string>>();
return calea;
}
...每次阅读该属性时都会创建一个新列表 ,而不仅仅是第一次。采用这种方法,calea
始终为null
。
尝试
get
{
if (null == calea)
calea = new LinkedList<GraphNode<string>>();
return calea;
}
<强>更新强>
该行
curr.Neighbors.ElementAt(i).Calea = curr.Calea;
不制作列表的副本。它将引用复制到列表中。之后对任何节点calea
所做的任何更改都将影响每个节点,而不仅仅是您之后的节点。
尝试
curr.Neighbors.ElementAt(i).Calea = new LinkedList<GraphNode<string>>(curr.Calea);
但是,在执行此操作之前,您应该确保.Neighbors
实际上有一个元素i
。
注意:对于未初始化的节点,这实际上会创建两个列表 - 一次读取Calea时(表达式的LH,调用您的.get
),另一个在右侧。
复制集合的方法有很多种。我建议谷歌搜索c# deep copy LinkedList<T>
。