Страницы

Поиск по вопросам

пятница, 13 марта 2020 г.

Predicate<T> и Func<string> в качестве T

#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(Func obj); Только один параметр. Во вторых, Вам @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 ""; }

Комментариев нет:

Отправить комментарий