简体   繁体   中英

Getter and Setter c#

I have multiple objects(nodes) and each node has a getter and setter for a list named Calea which contains other nodes, also each node has neighbours and they are also nodes . The problem is that list is stacking up and I can't figure out why , it's like a static variable and also I am not using that getter and setter anywhere else. Here is my code :

 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;

            }
        }

Code above shows the method for Cost and Calea , Cost works fine but Calea is stacking up.The code below is a sample of code of how I am setting the value Calea for each node:

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;

The sample code where I change the current node below:

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);
            }

A few words : pathNodesToVisit are all the nods which I want to visit(Dijkstra algorithm) , in the code above I remove the curr node from the list and the new curr node is a node which had the Costs and Calea changed.

I have no idea what you mean by "stacking up," but:

     public LinkedList<GraphNode<string>> Calea
    {
        get
        {

            if (calea == null) return new LinkedList<GraphNode<string>>();

            return calea;

        }

... creates a new list every time the property is read , not just the first time. calea will always be null with this approach.

Try

get 
{
    if (null == calea)
       calea = new LinkedList<GraphNode<string>>();

    return calea;
}

Update

The line

curr.Neighbors.ElementAt(i).Calea = curr.Calea;

Does not make a copy of the list. It copies a reference to the list. Any changes made to any node's calea afterward will affect every node, not just the one you're after.

Try

curr.Neighbors.ElementAt(i).Calea = new LinkedList<GraphNode<string>>(curr.Calea);

Though, you should make sure .Neighbors actually has an element i before doing this, among other things.

Note: In the case of an uninitialized node, this will actually create two lists - once when Calea is read (LH of the expression, which calls your .get ), and another on the right.

There are many ways to copy a collection. I suggest googling c# deep copy LinkedList<T> .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM