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.

È stato utile?

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top