@TimSchmelter AddRange is smart enough to look at the number of items being added in the range, and increase the size of the buffer once, by enough. You'll still be allocating the default size 10 buffer and not using it, but you won't be re-allocating lots of buffers.
–
ServyJul 18 '12 at 17:50

@Servy: Sorry, just deleted my comment. It cannot look at the number if the query is not executed, just if it can be casted to an ICollection<T>. Otherwise it must be executed and enumerated. The size is unknown until end in that case and the list might be twice as large as needed..
–
Tim SchmelterJul 18 '12 at 17:52

@TimSchmelter If it's not actually an IList then the constructor won't know the size either, so it will work just the same way. Clearly the programmer isn't manually entering a size, so he doesn't know at compile time what the [approximate] size will be.
–
ServyJul 18 '12 at 17:54

@Sery: Yes, that's not usual but what i wanted to say is, it's possible that there's a difference. var range=Enumerable.Range(1, 10000000);List<int> list=range.ToList() actually is much less efficient than list=new List<int>(10000000);list.AddRange(range) and even less efficient than list=new List<int>(range.Count());list.AddRange(range)(since the latter will ensure that the list is not larger than necessary).
–
Tim SchmelterJul 18 '12 at 17:59