How do I form a good predicate delegate to Find() something in my List<T>?

穿精又带淫゛_ 提交于 2019-12-02 15:37:23

Ok, in .NET 2.0 you can use delegates, like so:

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);
}

You can use a lambda expression as follows:

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

Or you can use an anonymous delegate:

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);
}

Since you can't use lambda you can just replace it with an anonymous delegate.

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

Hmm. Thinking more about it, you could use currying to return a predicate.

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

Now you can pass the result of this function (which is a predicate) to your Find method:

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

You can use this too:

var existData =
    cars.Find(
     c => c.Year== 1999);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!