views:

240

answers:

4

What is the proper use of ConverAll ? Will it convert one type to another type?

like

List<int> intList = new List<int>();
intList.Add(10);
intList.Add(20);
intList.Add(30);
intList.Add(33);

var query= intList.ConvertAll(x=>(double)x);

for this i can use cast or OfType<>.

+5  A: 

ConvertAll isn't an extension method, it's a real method on List<T> itself.

It returns a new list containing the converted elements. So in your example, the query variable isn't actually a query, it's a List<double>.

Cast and OfType are extension methods that operate on IEnumerable and return an IEnumerable<T>. However they're not suitable for your stated purpose: Cast can convert reference types but cannot convert value types, only unbox them. OfType doesn't perform any conversion, it just returns any elements that are already of the specified type.

LukeH
A: 

to my knowledge, OfType<T> will only return the elements in the collection that are of the specified type T. ConvertAll allows you to convert the elements to another type.

Frederik Gheysels
+1  A: 

ConvertAll will just call your delegate/anonymous method for each element of the list. What this does is entirely up to you.

In the example code you posted, it will attempt to cast each element to a double and return that, which means you'll get a List<Double> in return.

You should not use OfType<T>, since this will filter the elements based on the type, and will only return a different type than the original if it is type compatible due to inheritance or interface implementation.

In other words, .OfType<Double> will return no elements, since none of the ints are also doubles.

Lasse V. Karlsen
A: 

ConvertAll is a projection operator and maps most closely to LINQ's Select. LINQ's Cast is a specific projection operator and represents doing what you did [via projection] - or it would (as pointed out in Luke's answer [and comment], which I +1'd) if you weren't converting to a value type.

In general, LINQ has a more complete and well-thought-through set of operators, which makes older stuff like ConvertAll look a bit silly at times [like this]. (or @stoopid :D).

Ruben Bartelink
The `Cast` method isn't appropriate for what the OP is trying to do. `Cast` *will not work* for value-type conversion (eg, from `int` to `double`). The `Cast` method can only unbox value types, not convert them.
LukeH
Miles ahead of you (was editing that in having read your edit - thanks for doing the spadework!) :P (Your answer is great - I only bothered answering before it existed)
Ruben Bartelink