我试图理解之间的差异Action<T>, Func<T> and Predicate<T>
代表我的WPF / MVVM学习的一部分。
我知道Action<T> and Func<T>
既采取零到一+参数,仅Func<T>
而返回一个值Action<T>
别。
至于Predicate<T>
-我不知道。
因此,我想出了这个以下几个问题:
- 什么是
Predicate<T>
吗? (举例欢迎!) - 如果
Action<T>
返回什么 ,岂不是更简单,只需使用void
呢? (或任何其他类型,如果它是Func<T>
我们谈论。)
我希望你能避免您的问题LINQ /列表的例子。
我见过那些已经,但他们只是使它更令人混淆,因为这让我的代码,这些代表们的兴趣“什么都没有用它做(我想!)。
因此,我想使用一个代码,我很熟悉,让我的答案。
这里是:
public class RelayCommand : ICommand
{
readonly Action<object> _execute;
readonly Predicate<object> _canExecute;
public RelayCommand(Action<object> execute)
: this(execute, null)
{
}
public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
[DebuggerStepThrough]
public bool CanExecute(object parameters)
{
return _canExecute == null ? true : _canExecute(parameters);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameters)
{
_execute(parameters);
}
}
注意:
我拿出意见,以避免代码超长块。
完整的代码可以找到这里 。
任何帮助表示赞赏! 谢谢! :)
PS:请不要点我的其他问题。 我也尝试搜索,但我无法找到任何足够简单,我听不懂。
Predicate<T>
是一个代表,需要一个T
,并返回一个bool
。
它是完全等效于Func<T, bool>
。
不同的是, Predicate<T>
在NET 2.0的溶液中加入,而所有的Func<*>
代表在.NET 3.5加入。 (除了具有> 8组的参数的那些,这是在.NET 4.0加)
在LINQ样方法List<T>
FindAll()
TrueForAll()
等等)采取Predicate<T>
秒。
要回答你的第二个问题, void
,不能作为一种通用的参数。
什么是谓语呢? (举例欢迎!)
谓词是一个函数,它的参数,并返回布尔例如x > 20
如果动作没有返回,就不是很简单,只需使用无效呢? (或任何其他类型,如果它是Func键我们谈论。)
行动被定义为委托返回void。 在这里,人们可能会认为为什么有两种代表,只是这是设计的结果。 另一种方法是有Func
,返回Unit
,什么也不做。
什么是谓语呢? (举例欢迎!)
它必须返回boolean
,并在条件结构中使用。 它相当于( 但不能分配 )至Func<T, bool>
。 谓词是在列表主要用于类似的FindAll和removeall过的方法。
Action<T>
VS Func<T,bool>
你不能代表一个函数返回空隙作为Func<void, T>
所以Action<T>
是必需的。 Void
类型不能使用仿制药 。
Func<T,bool> and Predicate<T>
趋于相同的委托。 但是谓词是Kindof传统,因为谓词是因为从一开始委托类型时没有Func键或操作。 如果您将看到的FindAll /查找像数组类方法,列出他们使用Predicate.Predicates只返回布尔但Func键可以返回任何类型你指定所以也bool的当选,建议。
谓词是一个代表,需要一个T和返回一个布尔值,它在本质上是一个过滤功能。 或者说,是你将用它来做什么大部分。
如果你使用Linq的Where()扩展方法,你会看到它收到一个谓语委托作为参数,也可以使用谓词来创建更复杂的过滤方法为表达式和动态与AND或OR组合多个谓词代表它们之间等等条件。
例如,我必须建立在WPF中报告页面,用户可以动态地选择多个参数自定义报告页面的内容的要求,在这种情况下,我创造了选择的过滤选项谓词(日期时间间隔,布尔值,某些字符串必须包含在选择的字段等),然后合并的谓词,并将它们编译成我后用来过滤所述收集的数据我展示用户的表达式。
编辑:勾选此项- 为什么Func键<T,bool>的替代谓词<T>?
总之:编码规范状态,不再使用谓词和使用Func键代替
Func键和行动之间的区别是,你只是是否要委托返回一个值(使用Func键)或不(用行动)。
FUNC可能是在LINQ最常用的 - 例如在预测:
list.Select(x => x.SomeProperty)
或过滤:
list.Where(x => x.SomeValue == someOtherValue)
或键选择:
list.Join(otherList, x => x.FirstKey, y => y.SecondKey, ...)
Action
更常用的东西像List<T>
ForEach
:执行给定的动作列表中的每个项目。
我用这个少往往比Func
,虽然我有时会使用,例如,无参数的版本Control.BeginInvoke
和Dispatcher.BeginInvoke
。
Predicate
仅仅是一个特殊的套管Func<T, bool>
真,所有的前出台Func
和大部分的Action
代表来了。 我怀疑,如果我们就已经有了Func
和Action
在他们的各种名目, Predicate
就不会被引入...虽然它赋予一定意义的使用的delegate
,而Func
和Action
被用于广泛的不同目的。
Predicate
是在主要用于List<T>
像的方法FindAll
和RemoveAll
。