Introduction
It's possible to use LINQ queries to get data from an IEnumerable<T>. But for an IEnumerable, you can't use LINQ. If you write this LINQ query for an IEnumerable:
IEnumerable ienumerable = new int[] { 1, 5, 6, 7, 8, 11, 10, 134, 90 };
var integer = from i in ienumerable where i > 10 select i;
Then, you get this error:
Could not find an implementation of the query pattern for
source type 'System.Collections.IEnumerable'. 'Where' not found.
Consider explicitly specifying the type of the range variable 'i'.
In this tip, I tell you how to cast an IEnumerable to an IEnumerable<T>.
Cast an IEnumerable to an IEnumerable<T>
To cast an IEnumerable to an IEnumerable<T>, you can use this code:
IEnumerable ienumerable = new int[] { 1, 5, 6, 7, 8, 11, 10, 134, 90 };
IEnumerable casted = ienumerable.Cast<int>();
Now, you can use a LINQ query for casted. But, an IEnumerable can contain different types:
IEnumerable ienumerable = new object[] { 1, 5, 6, 7, 8, 11, 10, 134, 90, "test" };
With this code, you can get all integers from the IEnumerable into a IEnumerable<T> using the OfType<T> function:
IEnumerable ienumerable = new object[] { 1, 5, 6, 7, 8, 11, 10, 134, 90, "test" };
IEnumerable<int> allIntegers = ienumerable.OfType<int>();
Points of Interest
There're many collection classes in C# that inherit from IEnumerable, for example System.Windows.Forms.Control.ControlCollection, System.Windows.Forms.HtmlElementCollection or System.Xml.XmlNodeList class. It's useful to use LINQ for these classes.
History
- 22 Dec 2012: First version