Convert a sequence of objects to a sequence of specific type in LINQ .NET
August 9, 2017 Leave a comment
Say that you have some old style collection such as this:
ArrayList stringList = new ArrayList() { "this", "is", "a", "string", "list" };
You can easily turn this into a proper string list using the Cast operator:
IEnumerable<string> stringListProper = stringList.Cast<string>(); foreach (string s in stringListProper) { Console.WriteLine(s); }
…which results in…
this
is
a
string
list
It works of course for any object type, even for your custom objects.
However, what if you have the following starting point?
ArrayList stringList = new ArrayList() { "this", "is", "a", "string", "list", 1, 3, new Band() };
The integers and the Band object are not of type string so the Cast operator will throw an InvalidCastException. This is where the OfType extension enters the picture. It does the same job as Cast but it ignores all objects that cannot be converted:
IEnumerable<string> stringListProper = stringList.OfType<string>(); foreach (string s in stringListProper) { Console.WriteLine(s); }
…which yields the same output as above without throwing any exception.
So in case you need to deal with sequences you don’t control and whose content type you cannot be sure of then you should probably use the OfType extension.
You can view all LINQ-related posts on this blog here.