List<T>
メソッドを定義しますFind(Predicate<T> match)
。
Predicate<T>
署名に一致する任意のメソッドを参照できるデリゲートです
bool Predicate(T param)
あなたの場合Find
、学生のリストでメソッドを呼び出しているList<Student>
ため、Find
メソッドは次のシグネチャに一致する関数を期待しています:
bool MyFindMethod(Student param)
クラスでそのようなメソッドを次のように定義できます。
bool MyFindMethod(Student param)
{
// Logic goes here
}
Find
次のようにメソッドに渡します。
students.Find(MyFindMethod)
使用しているメソッドは小さくて単純なので、クラスでメソッドを作成するオーバーヘッドは価値がないため、ラムダ式を使用すると、同じメソッドを非常に簡潔な方法で定義できます。
s => s.Id == id
次と同等です。
bool AnonymousMethod(Student param)
{
return s.Id == id;
}
演算子の左側の=>
項目はメソッドに渡されるパラメーターであり、演算子の右側の項目=>
はメソッド本体です。
コンパイラーは、パラメーター (s
私の例では) が型であることを十分Student
に理解できるので、これを指定する必要はありません。
別のタイプの EG のリストがある場合
public class Customer
{
public string Name { get; set;}
}
public IList<Customer> customers = new List<Customer>();
Customer
その場合、コンパイラは、パラメーターが学生ではなく型であると推測します。
customers.Find(c => c.Name == name);
パラメータには任意の名前を付けることができますが、式を簡潔にするために通常は 1 文字にすることに注意してください。
これらすべてを理解すれば、コードが
students.Find(i => i.Id == id)
基本的に、パラメーターとして a を受け取り、それを評価して、演算子Student
の右側の基準に一致するかどうかを確認するメソッドを呼び出しています。=>
パラメータが基準を満たす場合 (つまり、学生が変数にId
一致するid
場合)、式は true を返します。これによりFind
、一致が見つかったことがメソッドに通知され、このオブジェクトが返されます。
ここでWPFに関連する同様の質問に答えましたが、別のコンテキストの例が理解に役立つかもしれません.