I have an array of Car objects
I want to conver them to a list of Vehicle objects
I thought this would work
Vehicle[] vehicles = cars.ConvertAll(car=> ConvertToVehicle(开发者_运维百科car)).ToArray();
but its complaining that ConvertAll requires two parameters.
here is the error:
Error 2 Using the generic method 'System.Array.ConvertAll(TInput[], System.Converter)' requires '2' type arguments C:\svncheckout\latestTrunk\Utility\test.cs 229 33
am i using the wrong method here?
You're using ConvertAll on an Array of cars (Car[]) instead of a List of cars (List) which does indeed require two type parameters1. If cars is a list your code will work.
That's a static function, written before extension methods were introduced, so you can't call it like a method.
Correct syntax:
Array.ConvertAll<Vehicle>(cars, car=> ConvertToVehicle(car))
While Array.ConvertAll
pre-dates things like extension methods, your expected behaviour is exactly how Select
works:
Vehicle[] vehicles = cars.Select(car=> ConvertToVehicle(car)).ToArray();
vs
Vehicle[] vehicles = Array.ConvertAll(cars, car=> ConvertToVehicle(car));
Differences:
Enumerable.Select
, while static, is an extension method - so appears to be an instance methodArray.ConvertAll
is static but isn't an extension methodEnumerable.Select
returns anIEnumerable<T>
, so you needEnumerable.ToArray
to get an arrayArray.ConvertAll
returns an array already, and additionally ensures it is the right size much more efficiently thanEnumerable.ToArray
can
If Car is a Sub Type of Vehicle Super Type you can do the following.It should work equally well if ConvertToVehicle returns a Vehicle type.
class Vehicle { }
class Car : Vehicle { }
class Program
{
static List<Car> ll = new List<Car>();
static void Main(string[] args)
{
Vehicle[] v = ll.ConvertAll<Vehicle>(x => (Vehicle)x).ToArray();
}
}
精彩评论