行动,Func键和谓语的代表 - C#[复制](Action, Func and Predicat

2019-08-05 04:41发布

这个问题已经在这里有一个答案:

  • 代表:谓语动作Func键 8个回答

我试图理解之间的差异Action<T>, Func<T> and Predicate<T>代表我的WPF / MVVM学习的一部分。

我知道Action<T> and Func<T>既采取零到一+参数,仅Func<T>而返回一个值Action<T>别。

至于Predicate<T> -我不知道。

因此,我想出了这个以下几个问题:

  1. 什么是Predicate<T>吗? (举例欢迎!)
  2. 如果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:请不要点我的其他问题。 我也尝试搜索,但我无法找到任何足够简单,我听不懂。

Answer 1:

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 ,不能作为一种通用的参数。



Answer 2:

什么是谓语呢? (举例欢迎!)

谓词是一个函数,它的参数,并返回布尔例如x > 20

如果动作没有返回,就不是很简单,只需使用无效呢? (或任何其他类型,如果它是Func键我们谈论。)

行动被定义为委托返回void。 在这里,人们可能会认为为什么有两种代表,只是这是设计的结果。 另一种方法是有Func ,返回Unit ,什么也不做。



Answer 3:

什么是谓语呢? (举例欢迎!)

它必须返回boolean ,并在条件结构中使用。 它相当于( 但不能分配 )至Func<T, bool> 。 谓词是在列表主要用于类似的FindAll和removeall过的方法。

Action<T> VS Func<T,bool>

你不能代表一个函数返回空隙作为Func<void, T> 所以Action<T>是必需的。 Void类型不能使用仿制药 。



Answer 4:

Func<T,bool> and Predicate<T> 

趋于相同的委托。 但是谓词是Kindof传统,因为谓词是因为从一开始委托类型时没有Func键或操作。 如果您将看到的FindAll /查找像数组类方法,列出他们使用Predicate.Predicates只返回布尔但Func键可以返回任何类型你指定所以也bool的当选,建议。



Answer 5:

谓词是一个代表,需要一个T和返回一个布尔值,它在本质上是一个过滤功能。 或者说,是你将用它来做什么大部分。

如果你使用Linq的Where()扩展方法,你会看到它收到一个谓语委托作为参数,也可以使用谓词来创建更复杂的过滤方法为表达式和动态与AND或OR组合多个谓词代表它们之间等等条件。

例如,我必须建立在WPF中报告页面,用户可以动态地选择多个参数自定义报告页面的内容的要求,在这种情况下,我创造了选择的过滤选项谓词(日期时间间隔,布尔值,某些字符串必须包含在选择的字段等),然后合并的谓词,并将它们编译成我后用来过滤所述收集的数据我展示用户的表达式。


编辑:勾选此项- 为什么Func键<T,bool>的替代谓词<T>?

总之:编码规范状态,不再使用谓词和使用Func键代替



Answer 6:

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.BeginInvokeDispatcher.BeginInvoke

Predicate仅仅是一个特殊的套管Func<T, bool>真,所有的前出台Func和大部分的Action代表来了。 我怀疑,如果我们就已经有了FuncAction在他们的各种名目, Predicate就不会被引入...虽然它赋予一定意义的使用的delegate ,而FuncAction被用于广泛的不同目的。

Predicate是在主要用于List<T>像的方法FindAllRemoveAll



文章来源: Action, Func and Predicate delegates - C# [duplicate]