Как вы объявляете встроенный делегат Predicate?
Я использую С#.
Итак, у меня есть объект, который имеет несколько полей, на самом деле не имеет значения.
У меня есть общий список этих объектов.
List<MyObject> myObjects = new List<MyObject>();
myObjects.Add(myObject1);
myObjects.Add(myObject2);
myObjects.Add(myObject3);
Поэтому я хочу удалить объекты из своего списка на основе некоторых критериев.
Например, myObject.X >= 10.
Для этого я хотел бы использовать метод RemoveAll(Predicate<T> match)
.
Я знаю, что могу определить делегат, который можно передать в RemoveAll, но я хотел бы знать, как определить этот встроенный с анонимным делегатом, вместо того, чтобы создавать кучу функций делегата, которые используются только один раз.
Ответы
Ответ 1
Есть два варианта: явный делегат или делегат, замаскированный как конструкция lamba:
явный делегат
myObjects.RemoveAll(delegate (MyObject m) { return m.X >= 10; });
лямбда
myObjects.RemoveAll(m => m.X >= 10);
Дополнение:
Производительность одинакова. По сути, обе языковые конструкции генерируют один и тот же IL при компиляции. Это связано с тем, что С# 3.0 в основном является расширением С# 2.0, поэтому он компилируется в конструкции С# 2.0:)
Ответ 2
Способ лямбда С# 3.0:
myObjects.RemoveAll(m => m.x >= 10);
Анонимный делегат С# 2.0:
myObjects.RemoveAll(delegate (MyObject m) {
return m.x >= 10;
});
И, для парней VB, способ VB 9.0 лямбда:
myObjects.RemoveAll(Function(m) m.x >= 10)
К сожалению, VB не поддерживает анонимный делегат.
Ответ 3
//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);
Ответ 4
Предикат - это делегат, который принимает параметр и возвращает логическое значение.
Мы можем сделать то же самое следующими способами:
1) Использование встроенного выражения Lambda
RemoveAll(p=> p.x > 2);
2) Использование анонимной функции
RemoveAll(delegate(myObject obj){
return obj.x >=10;
})
3) Использование делегата Predicate
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;
}