لماذا يتطلب C# Convertall 2 معلمات
-
01-10-2019 - |
سؤال
لدي مجموعة من كائنات السيارة
أريد تحويلها إلى قائمة كائنات السيارة
اعتقدت أن هذا سيعمل
Vehicle[] vehicles = cars.ConvertAll(car=> ConvertToVehicle(car)).ToArray();
ولكن يشكو من أن التحويل يتطلب معلمتين.
ها هو الخطأ:
خطأ 2 باستخدام الطريقة العامة "system.array.convertall (tinput [] ، system.converter)" يتطلب "2" وسيطات النوع C: svncheckout tusttrunk Utility test.cs 229 33
هل أستخدم الطريقة الخاطئة هنا؟
المحلول
أنت تستخدم Convertall على مجموعة مصفوفة للسيارات (سيارة []) بدلاً من أ قائمة للسيارات (القائمة) التي تتطلب بالفعل معلمتين من النوع1. إذا كانت السيارات هي القائمة ، فستنجح الرمز الخاص بك.
نصائح أخرى
هذه وظيفة ثابتة ، مكتوبة قبل تقديم طرق التمديد ، لذلك لا يمكنك تسميتها كطريقة.
بناء الجملة الصحيح:
Array.ConvertAll<Vehicle>(cars, car=> ConvertToVehicle(car))
في حين Array.ConvertAll
مسبقًا أشياء مثل طرق التمديد ، سلوكك المتوقع هو بالضبط كيف Select
الأعمال:
Vehicle[] vehicles = cars.Select(car=> ConvertToVehicle(car)).ToArray();
ضد
Vehicle[] vehicles = Array.ConvertAll(cars, car=> ConvertToVehicle(car));
اختلافات:
Enumerable.Select
, ، في حين أن ثابتة ، هي طريقة تمديد - لذلك يبدو لتكون طريقة مثيلArray.ConvertAll
ثابت ولكن ليس طريقة تمديدEnumerable.Select
يعودIEnumerable<T>
, ، لذا عليكEnumerable.ToArray
للحصول على صفيفArray.ConvertAll
إرجاع صفيف بالفعل ، ويضمن بالإضافة إلى ذلك أن الحجم الصحيح أكثر كفاءة منEnumerable.ToArray
يستطيع
إذا كانت السيارة نوعًا فرعيًا من النوع الفائق للسيارة ، فيمكنك القيام بما يلي. يجب أن تعمل بشكل جيد على قدم المساواة إذا كان ConvertToveHicle يعيد نوع السيارة.
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();
}
}