[英]How do you declare a Predicate Delegate inline?
所以我有一個包含一些字段的對象,這並不重要。 我有這些對象的通用列表。
List<MyObject> myObjects = new List<MyObject>();
myObjects.Add(myObject1);
myObjects.Add(myObject2);
myObjects.Add(myObject3);
所以我想根據一些標准從我的列表中刪除對象。 例如, myObject.X >= 10.
我想使用RemoveAll(Predicate<T> match)
方法來做到這一點。
我知道我可以定義一個可以傳遞給 RemoveAll 的委托,但我想知道如何使用匿名委托來定義這個內聯,而不是創建一堆只在一次使用的委托函數。
有兩個選項,一個顯式委托或一個偽裝成 Lamba 結構的委托:
顯式委托
myObjects.RemoveAll(delegate (MyObject m) { return m.X >= 10; });
拉姆達
myObjects.RemoveAll(m => m.X >= 10);
性能方面兩者是平等的。 事實上,兩種語言結構在編譯時都會生成相同的 IL。 這是因為 C# 3.0 基本上是 C# 2.0 的擴展,因此它編譯為 C# 2.0 構造
lambda C# 3.0 方式:
myObjects.RemoveAll(m => m.x >= 10);
匿名委托 C# 2.0 方式:
myObjects.RemoveAll(delegate (MyObject m) {
return m.x >= 10;
});
而且,對於 VB 人員,VB 9.0 lambda 方式:
myObjects.RemoveAll(Function(m) m.x >= 10)
不幸的是,VB 不支持匿名委托。
//C# 2.0
RemoveAll(delegate(Foo o){ return o.X >= 10; });
或者
//C# 3.0
RemoveAll(o => o.X >= 10);
或者
Predicate<Foo> matches = delegate(Foo o){ return o.X >= 10; });
//or Predicate<Foo> matches = o => o.X >= 10;
RemoveAll(matches);
Predicate 是一個委托,它接受一個參數並返回一個布爾值。
我們可以通過以下方式做同樣的事情
1)使用內聯 Lambda 表達式
RemoveAll(p=> p.x > 2);
2)使用匿名函數
RemoveAll(delegate(myObject obj){
return obj.x >=10;
})
3)使用謂詞委托
Predicate<myObject> matches = new Predicate<myObject>(IsEmployeeIsValid);
RemoveAll(matches);
Predicate<Foo> matches = delegate(Foo o){ return o.X >= 20; });
RemoveAll(matches);
3)顯式聲明委托並指向函數
public delegate bool IsInValidEmployee (Employee emp);
IsInValidEmployee invalidEmployeeDelegate = new IsInValidEmployee(IsEmployeeInValid);
myObjects.RemoveAll(myObject=>invalidEmployeeDelegate(myObject);
// 實際功能
public static bool IsEmployeeInValid(Employee emp)
{
if (emp.Id > 0 )
return true;
else
return false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.