user1998791
user1998791

Reputation: 58

Assign reference to list properly c#

I'm trying to add strings to a List<string> so I can print them with a loop in a certain point of time, being more specific here is part of my code:

public class Foo{
    public string propertyA;
    public string propertyB;
    public string propertyC;
    public List<string> list;
    Public Foo(){
         list = new List<string>();
         list.Add(propertyA);
         list.Add(propertyB);
         list.Add(propertyC);
    }
}

In later code, after assigning propertyA and the other variables and trying to iterate over the List I get empty strings. I require the properties to be in the list. My questions is which would be the best way to achieve this?

Upvotes: 3

Views: 121

Answers (3)

Grant Winney
Grant Winney

Reputation: 66439

What you're seeing is expected behavior. Updating "propertyA", etc later on won't update the strings that have already been added to the collection.

You could consider using a Dictionary instead of your own class, and then adding and updating elements is easier: (and you don't have to keep updating your class with new property names)

var properties = new Dictionary<string, string>();
properties.Add("propertyA", "some value of property A");
properties["propertyA"] = "some new value";

And when you want to display the values later:

MessageBox.Show(string.Join(Environment.NewLine, properties));

Alternatively, if you want a class and the option of adding properties to it, then maybe extending the Dictionary class like this will at least make things easier to maintain, so you can add more properties that'll stay in sync with the underlying Dictionary, with a minimum of fuss.

public class PropertyCollection : Dictionary<string, string>
{
    public string PropertyA
    {
        get { return GetValue(); }
        set { StoreValue(value); }
    }

    public string PropertyB
    {
        get { return GetValue(); }
        set { StoreValue(value); }
    }

    protected string GetValue([CallerMemberName] string propName = "")
    {
        if (ContainsKey(propName))
            return this[propName];

        return "";
    }

    protected void StoreValue(string propValue, [CallerMemberName] string propName = "")
    {
        if (ContainsKey(propName))
            this[propName] = propValue;
        else
            Add(propName, propValue);
    }
}

Upvotes: 2

AlexD
AlexD

Reputation: 32566

If you want to assign propertyA, B, C after an instance of Foo is created and enumerate them, you could try something like this:

public class Foo
{
    public string propertyA { get { return list[0]; } set { list[0] = value; } }
    public string propertyB { get { return list[1]; } set { list[1] = value; } }
    public string propertyC { get { return list[2]; } set { list[2] = value; } }
    public List<string> list = new List<string>() {"", "", ""};
}

For the reasons why the code behaves in a way you might not expect, see How are strings passed in .NET?

Upvotes: 1

Louie Bacaj
Louie Bacaj

Reputation: 1417

Looks like you are getting empty strings because when you are adding to the list the values in your properties have not been set at the time that the Foo() constructor is called...

Try passing values and setting them in the Foo constructor as follows:

public class Foo{
    public string propertyA;
    public string propertyB;
    public string propertyC;
    public List<string> list;
    Public Foo(string propA, string propB, string propC){
         propertyA = propA;
         propertyB = propB;
         propertyC = propC;
         list = new List<string>();
         list.Add(propertyA);
         list.Add(propertyB);
         list.Add(propertyC);
    }
}

Alternatively you could add the values to the list at a later time when the properties are actually set and not in the constructor e.g.

public string PropertyA
{
    //set the person name
    set {  propertyA = value;
           list.Add(value); 
        }
    //get the person name 
    get { return propertyA; }
}
...

Upvotes: 2

Related Questions