[英]How do I form a good predicate delegate to Find() something in my List<T>?
在查看MSDN之后,我仍然不清楚如何使用T的成員變量(其中T是一個類)在List中使用Find()方法形成一個正確的謂詞
例如:
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,所以我不認為Lambda符號可供我使用...
EDIT2:在示例中刪除了“1999”,因為我可能希望根據不同的值以編程方式“查找”。 使用for-do循環將示例更改為1980年至2000年的汽車范圍。
您可以使用lambda表達式,如下所示:
myCar = carList.Find(car => car.Year == 1999);
好的,在.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);
}
或者您可以使用匿名委托:
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<int, Predicate<Car>> 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.