Come si dichiara un delegato predicato in linea?
Domanda
Sto usando C#.
Quindi ho un oggetto che ha alcuni campi, non importa cosa.Ho un elenco generico di questi oggetti.
List<MyObject> myObjects = new List<MyObject>();
myObjects.Add(myObject1);
myObjects.Add(myObject2);
myObjects.Add(myObject3);
Quindi voglio rimuovere gli oggetti dal mio elenco in base ad alcuni criteri.Ad esempio, myObject.X >= 10.
Vorrei utilizzare il RemoveAll(Predicate<T> match)
metodo per farlo.
So di poter definire un delegato che può essere passato a RemoveAll, ma mi piacerebbe sapere come definirlo in linea con un delegato anonimo, invece di creare un insieme di funzioni delegate che vengono utilizzate solo in una volta.
Soluzione
Sono disponibili due opzioni, un delegato esplicito o un delegato mascherato da costrutto lamba:
delegato esplicito
myObjects.RemoveAll(delegate (MyObject m) { return m.X >= 10; });
lambda
myObjects.RemoveAll(m => m.X >= 10);
Aggiunta:
Per quanto riguarda le prestazioni, entrambi sono uguali.È un dato di fatto, entrambi i costrutti del linguaggio generano lo stesso IL quando compilati.Questo perché C# 3.0 è fondamentalmente un'estensione di C# 2.0, quindi si compila in costrutti C# 2.0 :)
Altri suggerimenti
Il modo lambda C# 3.0:
myObjects.RemoveAll(m => m.x >= 10);
Il delegato anonimo C# 2.0 in modo:
myObjects.RemoveAll(delegate (MyObject m) {
return m.x >= 10;
});
E, per i ragazzi di VB, il metodo lambda VB 9.0:
myObjects.RemoveAll(Function(m) m.x >= 10)
Sfortunatamente, VB non supporta un delegato anonimo.
//C# 2.0
RemoveAll(delegate(Foo o){ return o.X >= 10; });
O
//C# 3.0
RemoveAll(o => o.X >= 10);
O
Predicate<Foo> matches = delegate(Foo o){ return o.X >= 10; });
//or Predicate<Foo> matches = o => o.X >= 10;
RemoveAll(matches);
Il predicato è un delegato che accetta un parametro e restituisce un valore booleano.
Possiamo fare lo stesso nei seguenti modi
1) Utilizzo dell'espressione Lambda in linea
RemoveAll(p=> p.x > 2);
2) Utilizzando la funzione anonima
RemoveAll(delegate(myObject obj){
return obj.x >=10;
})
3) Utilizzo del delegato predicato
Predicate<myObject> matches = new Predicate<myObject>(IsEmployeeIsValid);
RemoveAll(matches);
Predicate<Foo> matches = delegate(Foo o){ return o.X >= 20; });
RemoveAll(matches);
3) Dichiarare esplicitamente un delegato e puntare a una funzione
public delegate bool IsInValidEmployee (Employee emp);
IsInValidEmployee invalidEmployeeDelegate = new IsInValidEmployee(IsEmployeeInValid);
myObjects.RemoveAll(myObject=>invalidEmployeeDelegate(myObject);
// Funzione effettiva
public static bool IsEmployeeInValid(Employee emp)
{
if (emp.Id > 0 )
return true;
else
return false;
}