繁体   English   中英

如何在List中创建一个好的谓词委托给Find() <T> ?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM