What is the difference between List <string> and IEnumerable <string>
These two seem to be doing the exact things. I timed them - knowing that this is a small example, but they seem to be working at the same speed. Is there any advantage to using one over the other?
List<string> alpha = new List<string>(new string[] { "a", "b", "c" }); foreach (var letter in alpha) { Console.WriteLine(letter); } IEnumerable<string> _alpha = new[] {"a", "b", "c"}; foreach(var _letter in _alpha) { Console.WriteLine(_letter); } These are different types of objects, with IEnumerable being the interface (not the instance itself, but just a schema for some functionality), and List is the actual class.
There is some kind of “advantage” to using one over the other.
If you are writing a method that you want to be more flexible and only need to list objects, use IEnumerable .
List implements IEnumerable and can be considered as such, like Collection , and many other classes.
Take this for example:
public void OutputEnumerable(IEnumerable<string> strings) { foreach (string s in strings) Console.WriteLine(s); } public void OutputList(List<string> strings) { foreach (string s in strings) Console.WriteLine(s); } Then you have the following data:
List<string> stringList = new List<string>(new [] { "a", "b", "c" }); Collection<string> stringCol = new Collection<string>(new [] { "a", "b", "c" }); IEnumerable<string> stringEn = new [] { "a", "b", "c" }; All these works:
OutputEnumerable(stringList); OutputEnumerable(stringCol); OutputEnumerable(stringEn); OutputList(stringList); And this is not so:
OutputList(stringCol); OutputList(stringEn); IEnumerable<string> is the interface. List<string> is a class that implements this interface.
An interface simply defines the functionality that a class that implements this interface must implement.
The class is responsible for the actual implementation of this functionality.
Your test actually checks for iteration speed through List<string> and string[] . With a small sample size and inner workings of the List<string> class, you really should not see the difference.
Your example really compares List<string> with string[] . Both of these types implement IEnumerable<string> , which is just an interface that defines the behavior of types.
As for the types themselves, the main difference is that the List<string> can be changed as necessary (and for most purposes it does not have a fixed length), and string[] must have the length specified at creation and cannot be changed . The performance of each of them should be belated.
Your example can also be written this way, with exactly the same meaning:
IEnumerable<string> alpha = new List<string>(new string[] { "a", "b", "c" }); foreach (var letter in alpha) { Console.WriteLine(letter); } IEnumerable<string> _alpha = new[] {"a", "b", "c"}; foreach(var _letter in _alpha) { Console.WriteLine(_letter); } List<string> is a concrete implementation of a collection of elements that has various methods such as Add , Remove , Sort , etc. It has all the elements that are already in memory, and can access them randomly using an indexer.
IEnumerable<string> is an interface that defines a sequence of strings that can be enumerated using a for loop or GetEnumerator() method. It does not contain additional methods that work with its elements, such as a list. In addition, elements may not be stored in memory, but may come from one source, one at a time.