Pergunta

Estou usando C#.

Então eu tenho um objeto que possui alguns campos, não importa o quê.Eu tenho uma lista genérica desses objetos.

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

Então, quero remover objetos da minha lista com base em alguns critérios.Por exemplo, myObject.X >= 10.Eu gostaria de usar o RemoveAll(Predicate<T> match) método para fazer isso.

Eu sei que posso definir um delegado que pode ser passado para RemoveAll, mas gostaria de saber como definir isso em linha com um delegado anônimo, em vez de criar um monte de funções de delegação que são usadas apenas uma vez.

Foi útil?

Solução

Existem duas opções, um delegado explícito ou um delegado disfarçado como uma construção lamba:

delegado explícito

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

lambda

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

Adição:

Em termos de desempenho, ambos são iguais.Na verdade, ambas as construções de linguagem geram o mesmo IL quando compiladas.Isso ocorre porque o C# 3.0 é basicamente uma extensão do C# 2.0, portanto ele é compilado para construções do C# 2.0 :)

Outras dicas

A maneira lambda C # 3.0:

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

O delegado anônimo C# 2.0:

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

E, para o pessoal do VB, o método lambda do VB 9.0:

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

Infelizmente, o VB não oferece suporte a um delegado anônimo.

  //C# 2.0
  RemoveAll(delegate(Foo o){ return o.X >= 10; });

ou

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

ou

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

Predicado é um delegado que recebe um parâmetro e retorna um booleano.

Podemos fazer o mesmo das seguintes maneiras

1) Usando expressão Lambda embutida

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

2) Usando função anônima

RemoveAll(delegate(myObject obj){

  return obj.x >=10;
})

3) Usando delegado predicado

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

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

3) Declarando um delegado explicitamente e apontando para uma função

public delegate bool IsInValidEmployee (Employee emp);

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

//Função real

public static bool IsEmployeeInValid(Employee emp)
{
    if (emp.Id > 0 )
        return true;
    else
        return false;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top