Pregunta

Estoy usando C#.

Entonces tengo un objeto que tiene algunos campos, realmente no importa qué.Tengo una lista genérica de estos objetos.

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

Entonces quiero eliminar objetos de mi lista según algunos criterios.Por ejemplo, myObject.X >= 10.Me gustaría usar el RemoveAll(Predicate<T> match) método para hacer esto.

Sé que puedo definir un delegado que se puede pasar a RemoveAll, pero me gustaría saber cómo definirlo en línea con un delegado anónimo, en lugar de crear un montón de funciones de delegado que solo se usan en un lugar.

¿Fue útil?

Solución

Hay dos opciones, un delegado explícito o un delegado disfrazado de construcción lamba:

delegado explícito

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

lambda

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

Suma:

En cuanto al rendimiento, ambos son iguales.De hecho, ambas construcciones del lenguaje generan el mismo IL cuando se compilan.Esto se debe a que C# 3.0 es básicamente una extensión de C# 2.0, por lo que se compila en construcciones de C# 2.0 :)

Otros consejos

La forma lambda C# 3.0:

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

La forma del delegado anónimo C# 2.0:

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

Y, para los chicos de VB, la forma lambda de VB 9.0:

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

Desafortunadamente, VB no admite delegados anónimos.

  //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);

El predicado es un delegado que toma un parámetro y devuelve un valor booleano.

Podemos hacer lo mismo de las siguientes maneras.

1) Usando expresión Lambda en línea

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

2) Usando función anónima

RemoveAll(delegate(myObject obj){

  return obj.x >=10;
})

3) Usando el predicado delegado

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

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

3) Declarar un delegado explícitamente y señalar una función

public delegate bool IsInValidEmployee (Employee emp);

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

// función real

public static bool IsEmployeeInValid(Employee emp)
{
    if (emp.Id > 0 )
        return true;
    else
        return false;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top