Создание пользовательского предиката - PullRequest
0 голосов
/ 07 января 2019

Я новичок в Лямбде и Делегатах. Я думаю, что мой вопрос не может быть хорошим вопросом, но я пытаюсь написать простой пользовательский предикат, который действует как встроенный предикат.

Итак, я собираюсь поделиться своим Кодексом: Пожалуйста, поделитесь со мной тем, где я собираюсь ошибиться:

Пример кода встроенного предиката:

namespace Built_In_Predicate
{
    class Program
    {
        static void Main(string[] args)
        {

            List<string> _ListOfPlayers = new List<string>()
            {
                "James Anderson",
                "Broad",
                "foo"
            };

            // Method 1. Predicate and Anonymous function.

            Predicate<string> _Predicate = delegate (string someString) { return someString.Length == 3; };

            string result = _ListOfPlayers.Find(_Predicate);

            Console.WriteLine("Result : {0}", result);
        }
    }
}

Попытка создать пользовательский предикат (код):

namespace CustomPredicate
{
    class Program
    {
        // Delegate (Takes some string as a Input and return a Boolean.)
        public delegate bool CustomPredicate(string someString);

        static void Main(string[] args)
        {

            List<string> _ListOfPlayers = new List<string>()
            {
                "James Anderson",
                "Broad",
                "foo"
            };

            //  Instance of CustomPredicate.
            CustomPredicate customPredicate = delegate (string someString) { return someString.Length == 3; };

            string result = _ListOfPlayers.Find(customPredicate); // its error.
        }
    }
}

Помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Делегаты не могут быть неявно преобразованы друг в друга, даже если они имеют одинаковую подпись.

Find ожидает System.Predicate<T>, поэтому у вас есть , чтобы дать ему System.Predicate<T>.

Вы можете написать свой собственный метод Find, если хотите использовать свой собственный CustomPredicate.

Существуют также способы использования переменной customPredicate при вызове Find:

_ListOfPlayers.Find(new Predicate<string>(customPredicate));
_ListOfPlayers.Find(customPredicate.Invoke);
0 голосов
/ 07 января 2019

Вы не можете вызывать Find с чем-то другим как тип Predicate. Но если вам нужен собственный делегат, вы можете вызвать FirstOrDefault (System.Linq) и затем использовать его.

    private delegate bool CustomPredicate (string t);

    static void Main(string[] args)
    {
        List<string> _ListOfPlayers = new List<string>()
        {
            "James Anderson",
            "Broad",
            "foo"
        };

        // Method 1. Predicate and Anonymous function.

        CustomPredicate _Predicate = delegate (string someString) { return    someString.Length == 3; };

        string result = _ListOfPlayers.FirstOrDefault(x => _Predicate(x));
        Console.WriteLine("Result : {0}", result);
        Console.ReadLine();
    }
...