创建一个自定义谓词

时间:2019-01-07 10:22:36

标签: c# lambda delegates anonymous-function predicate

我是Lambda和代表的新手。我认为我的问题可能不是一个好问题,但我正在尝试编写一个行为类似于内置谓词的“自定义谓词”。

所以我要分享我的代码:请与我分享我将要出错的地方:

内置谓词代码示例:

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 :(得分:2)

即使它们具有相同的签名,也不能将它们彼此隐式转换。

Find需要一个System.Predicate<T>,所以您必须给它一个System.Predicate<T>

如果您想使用自己的Find,则可以编写自己的CustomPredicate方法。

还有一些方法可以在对customPredicate的调用中使用Find变量:

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

答案 1 :(得分:1)

您不能使用“谓词”类型来调用“查找”。但是,如果您想要自己的委托,则可以调用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();
    }