How can i cast a List<object> to List<SomethingElse>?
(where SomethingElse is known to descend from object)
Bonus Chatter
Casting the list:
List<Object> first = ...;
List<SomethingElse> second = (List<SomethingElse>)first;
doesn’t work:
Cannot convert type ‘System.Collections.Generic.List’ to ‘System.Collections.Generic.List’
Casting the list:
List<SomethingElse> second = first.Cast<SomethingElse>();
doesn’t work:
Cannot implicitely convert type ‘System.Collections.Generic.List’ to ‘System.Collections.Generic.List’
i don’t actually need the full List<T> object, just an ICollection<T> will do:
ICollection<SomethingElse> second = first;
ICollection<SomethingElse> second = (ICollection<SomethingElse>)first;
ICollection<SomethingElse> second = first.Cast<SomethingElse>();
don’t work.
LINQ, as implemented through the extension methods within the
Enumerableclass, relies on deferred execution:Cast<T>does not create a new list immediately, but rather stores all the information that is required to perform the action. The list would only get enumerated when required (for example, through aforeachstatement).In your case, if you simply intend to iterate over the sequence, you should consider sticking to the
IEnumerable<T>interface, which is the declared return type ofCast<T>:This is efficient, since it only performs the cast as each item is iterated.
If you’re convinced you want a new list to be created immediately, use
ToList:Edit: Replying to point posted in comment:
It depends on what you mean by “a list that can be modified”. There are several LINQ query operators that will allow you to alter the definition of your query further. For example, if you want to remove all
SomethingElseelements whoseIsDeletedproperty istrue, you can use theWhereoperator:If you want to add a sequence of new elements, you can use the
Concatoperator:If you want to sort your sequence in ascending order of
ID, use theOrderByoperator:Each time, we’re applying a query operator over the former definition of our query, and assigning the new (composite) query to our
secondvariable. LINQ would store all your operators in the query definition. Then, when the sequence is actually enumerated (for example, through aforeachorToList), it would give you the composite result of your sequence, with all the query operators applied in order.As with all cases of deferred execution / lazy evaluation, be careful not to go overboard with this. If, for example, you’re going to apply a
Whereoperator which will reduce the size of your sequence drastically, it might make sense to execute the query eagerly and store the enumerated list instead.