#c_sharp #wpf
Есть List< Func< string>> нужно вызвать List.RemoveAll().Туда нужно передать Predicate< T>. нужно удалить только определнные функции. На MSDN Видел пример с Point, но попытка переделать аналогично под Func не получается. В чем проблема? List> _list; public MainWindow() { _list = new List >(); _list.Add(this.test); _list.Add(this.test2); _list.Add(this.test); _list.Add(this.test2); _list.Add(this.test); Predicate > pre = ValidateFunc(test2,nameof(test2));// тут функция и подчеркивается с ошибкой } private static bool ValidateFunc(Func obj,string targetName) { return targetName == nameof(obj); } string test() { textBox.Text += " 2"; return ""; } string test2() { textBox.Text += " 3"; return ""; } Ошибка:Не удается неявно преобразовать тип "bool" в "System.Predicate< System.Func< string>>" Если как на MSDN без параметров то ошибка такая: Нет перегруженного метода для "ValidateFunc", который соответствует делегату "Predicate< Func< string>>"
Ответы
Ответ 1
Я предлагаю такой вариант: Predicate> pre = item => item == this.test; В частности, при использовании этого предиката в качестве аргумента метода _list.RemoveAll, из коллекции _list будут удалены все вхождения метода test. Либо так, если вместо ссылки на метод вы желаете использовать строку с именем метода: Predicate > pre = item => item.Method.Name == "test"; А назначение вашего метода ValidateFunc мне понять не удалось. Вы в нем сравниваете строку targetName с nameof(obj) (то есть со строковой константой "obj"). Ответ 2
Ответ @DmitryD самый полезный для моего решения. То, чего необходимо было добиться выглядит так: List> _list; public MainWindow() { _list = new List >(); _list.Add(this.test); _list.Add(this.test2); _list.RemoveAll(getpredicate(test2)); } static public Predicate > getpredicate(Func obj) { Predicate > pre2 = item => item == obj; return pre2; } Ответ 3
Во первых, ValidateFunc должен выглядеть следующим образом private static bool ValidateFunc(Funcobj); Только один параметр. Во вторых, Вам @Etki сделал корректное замечание, Вы неправильно инициализируете свой Predicate > pre, Вы там вызываете Вашу функцию ValidateFunc, а надо так: Predicate > pre = new Predicate >(ValidateFunc); Ну и конечно, как нужно было код написать целиком: List > _list; public MainWindow() { _list = new List >(); _list.Add(this.test); _list.Add(this.test2); _list.Add(this.test); _list.Add(this.test2); _list.Add(this.test); Predicate > pre = new Predicate >(ValidateFunc); _list.RemoveAll(pre); } private static bool ValidateFunc(Func obj) { return "test2" == obj.Method.Name; } string test() { textBox.Text += " 2"; return ""; } string test2() { textBox.Text += " 3"; return ""; } Ну и вариант решения с помощью лямбда функции: List > _list; public MainWindow() { _list = new List >(); _list.Add(this.test); _list.Add(this.test2); _list.Add(this.test); _list.Add(this.test2); _list.Add(this.test); _list.RemoveAll(f => f.Method.Name == "test2"); } string test() { textBox.Text += " 2"; return ""; } string test2() { textBox.Text += " 3"; return ""; }
Комментариев нет:
Отправить комментарий