25

MSDN を見た後、T のメンバー変数を使用して List で Find() メソッドを使用するための適切な述語をどのように形成する必要があるかはまだ不明です (T はクラスです)。

例えば:

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 を使用しているため、ラムダ表記は利用できないと思います...

EDIT2:異なる値に基づいてプログラムで「検索」したい場合があるため、例の「1999」を削除しました。for-do ループを使用して、例を 1980 年から 2000 年までの自動車の範囲に変更しました。

4

6 に答える 6

31

次のようにラムダ式を使用できます。

myCar = carList.Find(car => car.Year == 1999);
于 2008-10-28T02:09:11.950 に答える
30

OK、.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);
}
于 2008-10-28T02:15:32.827 に答える
15

または、匿名デリゲートを使用できます。

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);
}
于 2008-10-28T02:28:38.963 に答える
7

ラムダを使用できないため、匿名デリゲートに置き換えることができます。

myCar = carList.Find(delegate(Car car) { return car.Year == i; });
于 2008-10-28T04:57:36.730 に答える
2

うーん。さらに考えてみると、カリー化を使用して述語を返すことができます。

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

これで、この関数の結果 (述語) を Find メソッドに渡すことができます。

my99Car = cars.Find(byYear(1999));
my65Car = cars.Find(byYear(1965));
于 2008-10-28T02:06:18.790 に答える