代码之家  ›  专栏  ›  技术社区  ›  Pretzel

如何形成一个好的谓词委托来查找我列表中的()内容?

  •  22
  • Pretzel  · 技术社区  · 17 年前

    在查看了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”,因为我可能希望根据不同的值以编程方式“查找”。示例改为1980年至2000年使用for do循环的汽车系列。

    6 回复  |  直到 9 年前
        1
  •  30
  •   Matt Hamilton    17 年前

    好的,在.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);
    }
    
        2
  •  28
  •   Dan Finucane    17 年前

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

    myCar = carList.Find(car => car.Year == 1999);
    
        3
  •  14
  •   cHao    17 年前

    或者可以使用匿名委托:

    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);
    }
    
        4
  •  7
  •   Ajaxx    17 年前

    因为不能使用lambda,所以可以用匿名委托替换它。

    myCar = carList.Find(delegate(Car car) { return car.Year == i; });
    
        5
  •  2
  •   Matt Hamilton    17 年前

    嗯,再考虑一下,你可以用currying返回一个谓词。

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

    现在可以将此函数(谓词)的结果传递给find方法:

    my99Car = cars.Find(byYear(1999));
    my65Car = cars.Find(byYear(1965));
    
        6
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    9 年前

    您也可以使用它:

    var existData =
        cars.Find(
         c => c.Year== 1999);
    
    推荐文章