簡體   English   中英

你如何聲明一個 Predicate Delegate 內聯?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM