我正在使用委托来保存一些测试值并返回true / false结果的方法。在得知对委托的调用只返回委托中最后一个方法的结果后,我不确定如何继续。
我想收到委托中所有方法调用的结果列表,或者是否有任何调用返回true。
首先,我尝试用foreach枚举代理,但是没有用。我必须事先将这些方法拉出来
System.Delegate[] methods = int_testers.GetInvocationList();
// Methods in int_testers returns true when a condition is met by the input value
然后使用'methods'
中每个成员的动态调用进行枚举foreach (var item in ds) {
if ((bool)item.DynamicInvoke(4))
return true;
}
但是,我已经读过DynamicInvoke比Invoke更慢(数量级或更多),这是我不愿意做出的权衡。
到目前为止,我发现的替代方案是列出Func<int,bool>
并列举这些,
List<Func<int,bool>> methods = ....; // Add the methods into the list
foreach (var method in methods) {
if(method(4)) {
return true;
}
}
虽然这有效,但似乎是代表们要解决的问题。那么,最后,有没有办法从委托中获取结果列表而无需手动模拟委托?
这实际上是在函数术语中使用map
函数的结果,但我没有足够的C#经验将这个想法很好地用于我正在做的事情。
我稍微调查了LINQ,看起来它可以使用我概述的第二种方法,虽然在这种情况下我似乎无法使用LINQ和委托。
答案 0 :(得分:1)
您可以使用Predicate<T>
代替委托,使用LINQ的Any()
代替for循环:
var methods = new List<Predicate<T>>();
// add methods to list
return methods.Any(x => x(4));