كيف يمكنني تشكيل مندوب المسند جيد للعثور على) شيء (في بلدي قائمة ؟

StackOverflow https://stackoverflow.com/questions/242012

سؤال

وبعد النظر في MSDN، فإنه لا يزال من غير الواضح بالنسبة لي كيف ينبغي أن تشكل المسند الصحيح لاستخدام أسلوب بحث () في قائمة باستخدام متغير عضو T (حيث T هي فئة)

وعلى سبيل المثال:

public class Car
{
   public string Make;
   public string Model;
   public int Year;
}

{  // somewhere in my code
   List<Car> carList = new List<Car>();
   // ... code to add Cars ...

   Car myCar = new Car();

   // Find the first of each car made between 1980 and 2000
   for (int x = 1980; x < 2000; x++)
   {
       myCar = carList.Find(byYear(x));
       Console.Writeline(myCar.Make + myCar.Model);
   }
}

وماذا يجب بلادي "byYear" المسند تبدو؟

و(MSDN المثال لا تتحدث إلا عن قائمة الديناصورات وتفتيش الوحيدة ل"saurus" قيمة ثابتة - لا تظهر كيفية تمرير قيمة في المسند ...)

وتحرير: أنا باستخدام VS2005 / .NET2.0، لذلك لا أعتقد أن لامبدا تدوين متاح لي ...

وEDIT2: إزالة "1999" في المثال لأنني قد ترغب في "البحث" استنادا برمجيا على قيم مختلفة. تغيرت سبيل المثال إلى مجموعة من السيارات 1980-2000 تستخدم لتفعل حلقة.

هل كانت مفيدة؟

المحلول

وطيب، في. NET 2.0 يمكنك استخدام المندوبين، كما يلي:

static Predicate<Car> ByYear(int year)
{
    return delegate(Car car)
    {
        return car.Year == year;
    };
}

static void Main(string[] args)
{
    // yeah, this bit is C# 3.0, but ignore it - it's just setting up the list.
    List<Car> list = new List<Car>
    {
        new Car { Year = 1940 },
        new Car { Year = 1965 },
        new Car { Year = 1973 },
        new Car { Year = 1999 }
    };
    var car99 = list.Find(ByYear(1999));
    var car65 = list.Find(ByYear(1965));

    Console.WriteLine(car99.Year);
    Console.WriteLine(car65.Year);
}

نصائح أخرى

ويمكنك استخدام تعبير لامدا كما يلي:

myCar = carList.Find(car => car.Year == 1999);

وأو يمكنك استخدام مندوب مجهول:

Car myCar = cars.Find(delegate(Car c) { return c.Year == x; });

// If not found myCar will be null
if (myCar != null)
{
     Console.Writeline(myCar.Make + myCar.Model);
}

ومنذ لا يمكنك استخدام امدا يمكنك استبدال فقط مع مندوب مجهول.

myCar = carList.Find(delegate(Car car) { return car.Year == i; });

وهم. التفكير أكثر حول هذا الموضوع، هل يمكن استخدام التمشيط لإرجاع المسند.

Func<int, Predicate<Car>> byYear = i => (c => c.Year == i);

والآن يمكنك تمرير نتيجة لهذه الوظيفة (والذي هو المسند) إلى أسلوب بحث الخاص بك:

my99Car = cars.Find(byYear(1999));
my65Car = cars.Find(byYear(1965));

ويمكنك استخدام هذا أيضا:

var existData =
    cars.Find(
     c => c.Year== 1999);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top