Why does adding a new value to list overwrite previous values in the list

You’re using the same instance of the Tag object inside the loop, so each update to the TagName is to the same reference. Move the declaration inside the loop to get a fresh object on each pass of the loop:

foreach (string t in tagList)
{
    Tag _tag = new Tag(); // create new instance for every iteration

    _tag.tagName = t;
    tags.Add(_tag);
}

For bonus part – when you change Tag from class to struct copy operation (that happens when you call tags.Add(_tag)) copies whole instance (essentially creating new one) unlike in original class case when only reference to the same single instance is copied into the parameter of the call and then to the list’s element (see C# pass by value vs. pass by reference for explanation on how struct passed to method calls).

Leave a Comment