views:

6069

answers:

3

If I have:

List<string> myList1;
List<string> myList2;
int placeToCheckValues = 0; //Used for breakpoints since the values don't get updated until after the line is executed

myList1 = getMeAList();
placeToCheckValues = 0;    //Checked myList1 here, it contains 4 strings

myList2 = getMeAnotherList();
placeToCheckValues = 0;    //Checked myList2 here, it contains 6 strings

myList1.Concat(myList2);
placeToCheckValues = 0;    //Checked mylist1 again, it contains 4 strings... why?

I ran code similar to this in Visual Studio 2008 and set break points after each execution. After myList1 = getMeAList();, myList1 contains 4 strings-> I pressed the plus button to make sure they weren't all nulls. After myList2 = getMeAnotherList();, myList2 contains 6 strings-> I checked to make sure they weren't null... After myList1.Concat(myList2); myList1 contained only 4 strings. Why is that?

Thanks,
Matt

+5  A: 

Try this:

myList1 = myList1.Concat(myList2).ToList();

Concat returns an IEnumerable<T> that is the two lists put together, it doesn't modify either existing list. Also, since it returns an IEnumerable, if you want to assign it to a variable that is List<T>, you'll have to call ToList() on the IEnumerable<T> that is returned.

Jonathan
Now that I re-read the question, .AddRange() does sound like what the OP really wants.
Jonathan
+14  A: 

Concat returns a new sequence without modifying the original list. Try myList1.AddRange(myList2).

John Kugelman
A: 

Concat isn't updating myList1; it's returning a new list containing the concatenated myList1 and myList2.

Use myList1.AddRange(myList2) instead.

Jacob