Как вы объявляете встроенного делегата предиката? - PullRequest
41 голосов
/ 12 сентября 2008

Я использую C #.

Итак, у меня есть объект, у которого есть несколько полей, неважно, что. У меня есть общий список этих объектов.

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

Итак, я хочу удалить объекты из моего списка на основе некоторых критериев. Например, myObject.X >= 10. Я хотел бы использовать метод RemoveAll(Predicate<T> match) для этого.

Я знаю, что могу определить делегата, который можно передать в RemoveAll, но я хотел бы знать, как определить этот встроенный анонимный делегат вместо создания группы функций делегата, которые используются только в одном месте. 1010 *

Ответы [ 4 ]

53 голосов
/ 12 сентября 2008

Есть два варианта: явный делегат или делегат, замаскированный под конструкцию lamba:

явный делегат

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

лямбда

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

Дополнительно:

Производительность в обоих случаях одинакова. На самом деле, обе языковые конструкции генерируют один и тот же IL при компиляции. Это потому, что C # 3.0 в основном является расширением C # 2.0, поэтому он компилируется в конструкции C # 2.0:)

15 голосов
/ 12 сентября 2008

Лямбда C # 3.0 способ:

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

Анонимный делегат C # 2.0, способ:

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

И, для парней VB, лямбда-путь VB 9.0:

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

К сожалению, VB не поддерживает анонимного делегата.

10 голосов
/ 12 сентября 2008
  //C# 2.0
  RemoveAll(delegate(Foo o){ return o.X >= 10; });

или

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

или

  Predicate<Foo> matches = delegate(Foo o){ return o.X >= 10; });
  //or Predicate<Foo> matches = o => o.X >= 10;
  RemoveAll(matches);
0 голосов
/ 19 ноября 2017

Предикат - это делегат, который принимает параметр и возвращает логическое значение.

Мы можем сделать то же самое следующими способами

1) Использование встроенного лямбда-выражения

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

2) Использование анонимной функции

RemoveAll(delegate(myObject obj){

  return obj.x >=10;
})

3) Использование предиката делегата

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

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

3) Явное объявление делегата и указание на функцию

public delegate bool IsInValidEmployee (Employee emp);

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

// Фактическая функция

public static bool IsEmployeeInValid(Employee emp)
{
    if (emp.Id > 0 )
        return true;
    else
        return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...