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.
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:)
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.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);
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;
}
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