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を使用しているので、ラムダ記法が利用できないと思います...
EDIT2:異なる値に基づいてプログラムで「検索」したい場合があるため、例の「1999」を削除しました。 for-doループを使用して、例が1980年から2000年の車の範囲に変更されました。
さて、.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);
}
次のようにラムダ式を使用できます。
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);
}
ラムダは使用できないため、匿名のデリゲートに置き換えることができます。
myCar = carList.Find(delegate(Car car) { return car.Year == i; });
うーん。もっとよく考えると、カレーを使って述語を返すことができます。
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);