سؤال

لدي مجموعة من كائنات السيارة

أريد تحويلها إلى قائمة كائنات السيارة

اعتقدت أن هذا سيعمل

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();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top