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