有了真实的例子和它们的使用,有人可以帮助我理解:
Func<T, ..>
Action<T>
Predicate<T>
网友回答:
Func – 当您想要一个函数的委托时,该函数可能会也可能不会接受参数并返回值。最常见的示例是从 LINQ 中选择:
var result = someCollection.Select( x => new { x.Name, x.Address });
操作 – 当您需要函数的委托时,该函数可能会也可能不会接受参数并且不返回值。我经常将这些用于匿名事件处理程序:
button1.Click += (sender, e) => { /* Do Some Work */ }
谓词 – 当您需要 Func 的专用版本时,该版本根据一组条件评估值并返回布尔结果(对于匹配为 true,否则为 false)。同样,这些在 LINQ 中经常用于诸如 Where:
var filteredResults =
someCollection.Where(x => x.someCriteriaHolder == someCriteria);
我只是仔细检查了一下,结果发现 LINQ 不使用谓词。不知道他们为什么做出这个决定…但从理论上讲,这仍然是一个适合谓词的情况。
网友回答:
和之间的区别只是您希望委托返回值(使用 )还是不返回值(使用 )。Func
Action
Func
Action
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
Func
Action
Predicate
主要用于 和 等方法。List<T>
FindAll
RemoveAll
网友回答:
Action 是指向方法的委托(指针),该方法采用零个、一个或多个输入参数,但不返回任何内容。
Func 是指向方法的委托(指针),该方法采用零个、一个或多个输入参数,并返回一个值(或引用)。
谓词是一种特殊的 Func,通常用于比较(采用泛型参数并返回布尔值)。
虽然 Action 和 Func 广泛用于 Linq,但它们在逻辑上独立于 Linq 的概念。C++已经以类型化函数指针的形式包含了基本概念。
下面是一个不使用 Linq 的 Action 和 Func 的小示例:
class Program
{
static void Main(string[] args)
{
Action<int> myAction = new Action<int>(DoSomething);
myAction(123); // Prints out "123"
// can be also called as myAction.Invoke(123);
Func<int, double> myFunc = new Func<int, double>(CalculateSomething);
Console.WriteLine(myFunc(5)); // Prints out "2.5"
}
static void DoSomething(int i)
{
Console.WriteLine(i);
}
static double CalculateSomething(int i)
{
return (double)i/2;
}
}
模板简介:该模板名称为【我们什么时候需要代表?Func