Getter和Setter c#

时间:2018-06-13 19:01:02

标签: c#

我有多个对象(节点),每个节点都有一个名为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的节点。

1 个答案:

答案 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>