创建自定义谓词

Creating a Custom 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.
        }
    }
}

我们将不胜感激。

您不能使用其他类型作为 Predicate 来调用 Find。但是如果你想要自己的委托,你可以调用 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();
    }

委托不能相互隐式转换,即使它们具有相同的签名。

Find 需要一个 System.Predicate<T> 所以你 给它一个 System.Predicate<T>.

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

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

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