Rehan Shah
Rehan Shah

Reputation: 1627

Creating a Custom Predicate

I am new to Lambda's and Delegates. I think my question may not be a good question but i am trying to write a simple Custom Predicate that act just like a Built-In Prediciate.

So i am going to share my Code: Please share with me that where i am going to make a mistake:

Built-In Predicate Code Example:

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);
        }
    }
}

Trying to Create a Custom Predicate (Code):

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.
        }
    }
}

Help will be appreciated.

Upvotes: 2

Views: 1185

Answers (2)

Sweeper
Sweeper

Reputation: 273380

Delegates cannot be implicitly converted to each other even if they have the same signature.

Find expects a System.Predicate<T> so you have to give it a System.Predicate<T>.

You can write your own Find method if you want to use your own CustomPredicate.

There are also ways to use your customPredicate variable in the call to Find:

_ListOfPlayers.Find(new Predicate<string>(customPredicate));
_ListOfPlayers.Find(customPredicate.Invoke);

Upvotes: 2

Malior
Malior

Reputation: 1341

You cannot call Find with something else as the type Predicate. But if you want your own delegate, you could call FirstOrDefault (System.Linq) and then use it.

    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();
    }

Upvotes: 1

Related Questions