如何在List 中为Find()创建一个好的谓词委托?

在查看MSDN之后,我仍然不清楚如何使用T的成员变量(其中T是一个类)在List中使用Find()方法形成一个正确的谓词

例如:

public class Car { public string Make; public string Model; public int Year; } { // somewhere in my code List carList = new List(); // ... 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,所以我不认为Lambda符号可供我使用…

EDIT2:在示例中删除了“1999”,因为我可能希望根据不同的值以编程方式“查找”。 使用for-do循环将示例更改为1980年至2000年的汽车范围。

好的,在.NET 2.0中,您可以使用委托,如下所示:

 static Predicate 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 list = new List { 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); } 

您可以使用lambda表达式,如下所示:

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

由于你不能使用lambda,你可以用匿名委托替换它。

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

嗯。 更多地考虑它,你可以使用currying来返回谓词。

 Func> byYear = i => (c => c.Year == i); 

现在,您可以将此函数的结果(这是一个谓词)传递给Find方法:

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

你也可以使用它:

 var existData = cars.Find( c => c.Year== 1999);