Jak zadeklarować predykat delegata inline?

Używam C#.

Więc mam obiekt, który ma kilka pól, nie ma znaczenia co. Mam ogólną listę tych obiektów.

List<MyObject> myObjects = new List<MyObject>();
myObjects.Add(myObject1);
myObjects.Add(myObject2);
myObjects.Add(myObject3);

Więc chcę usunąć obiekty z mojej listy na podstawie pewnych kryteriów. Na przykład, myObject.X >= 10. Chciałbym w tym celu użyć metody RemoveAll(Predicate<T> match).

Wiem, że mogę zdefiniować delegata, który może zostać przekazany do RemoveAll, ale chciałbym wiedzieć, jak zdefiniować ten delegat inline z anonimowym delegatem, zamiast tworzyć kilka grup. deleguj funkcje, które są używane tylko raz.

Author: aku, 2008-09-12

4 answers

Są dwie opcje, jawny delegat lub delegat przebrany za konstrukcję lamba:

Explicit delegate

myObjects.RemoveAll(delegate (MyObject m) { return m.X >= 10; });

Lambda

myObjects.RemoveAll(m => m.X >= 10);

Dodanie:

Pod względem wydajności oba są równe. W rzeczywistości obie konstrukcje językowe generują ten sam IL podczas kompilacji. Jest to spowodowane tym, że C# 3.0 jest w zasadzie rozszerzeniem C # 2.0, więc kompiluje się do konstrukcji C # 2.0:)

 52
Author: Erik van Brakel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-12 14:48:08

Sposób lambda C# 3.0:

myObjects.RemoveAll(m => m.x >= 10);

The anonymous delegate C # 2.0 way:

myObjects.RemoveAll(delegate (MyObject m) {
   return m.x >= 10;
});
[[3]}A dla chłopaków z VB, VB 9.0 lambda way:
myObjects.RemoveAll(Function(m) m.x >= 10)
Niestety, VB nie obsługuje anonimowego delegata.
 15
Author: Mark Brackett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-12 14:49:10
  //C# 2.0
  RemoveAll(delegate(Foo o){ return o.X >= 10; });

Lub

  //C# 3.0
  RemoveAll(o => o.X >= 10);

Lub

  Predicate<Foo> matches = delegate(Foo o){ return o.X >= 10; });
  //or Predicate<Foo> matches = o => o.X >= 10;
  RemoveAll(matches);
 10
Author: Mark Cidade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-12 14:50:41

Predykat jest delegatem, który pobiera param i zwraca wartość logiczną.

Możemy zrobić to samo w następujący sposób

1) używanie wbudowanego wyrażenia Lambda

RemoveAll(p=> p.x > 2);

2) korzystanie z funkcji anonimowej

RemoveAll(delegate(myObject obj){

  return obj.x >=10;
})

3) użycie delegata predykatu

Predicate<myObject> matches = new Predicate<myObject>(IsEmployeeIsValid);
RemoveAll(matches);

Predicate<Foo> matches = delegate(Foo o){ return o.X >= 20; });
RemoveAll(matches);

3) deklarowanie delegata w sposób jednoznaczny i wskazywanie na funkcję

public delegate bool IsInValidEmployee (Employee emp);

IsInValidEmployee invalidEmployeeDelegate = new IsInValidEmployee(IsEmployeeInValid);
myObjects.RemoveAll(myObject=>invalidEmployeeDelegate(myObject);

/ / Funkcja rzeczywista

public static bool IsEmployeeInValid(Employee emp)
{
    if (emp.Id > 0 )
        return true;
    else
        return false;
}
 0
Author: Nayas Subramanian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-19 09:28:42