我是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.
}
}
}
我们将不胜感激。
答案 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();
}