通过实例和它们的使用,有人可以帮助我理解:
Jon*_*eet 885
Func
和之间的区别Action
仅在于您是否希望委托返回值(使用Func
)或不使用(使用Action
).
Func
可能是LINQ中最常用的 - 例如在投影中:
list.Select(x => x.SomeProperty)
Run Code Online (Sandbox Code Playgroud)
或过滤:
list.Where(x => x.SomeValue == someOtherValue)
Run Code Online (Sandbox Code Playgroud)
或关键选择:
list.Join(otherList, x => x.FirstKey, y => y.SecondKey, ...)
Run Code Online (Sandbox Code Playgroud)
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
.
Kna*_*bax 353
Action是方法的委托(指针),它接受零个,一个或多个输入参数,但不返回任何内容.
Func是方法的委托(指针),它接受零个,一个或多个输入参数,并返回一个值(或引用).
谓词是一种特殊的Func,经常用于比较.
虽然广泛用于Linq,但Action和Func在概念上与Linq无关.C++已经包含了类型化函数指针形式的基本概念.
这是Action和Func的一个小例子,不使用Linq:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Jus*_*ner 65
Func - 当您想要一个函数的委托时,该函数可能会也可能不会获取参数并返回一个值.最常见的例子是从LINQ中选择:
var result = someCollection.Select( x => new { x.Name, x.Address });
Run Code Online (Sandbox Code Playgroud)
操作 - 当您希望某个函数的委托可能带有或不带参数但不返回值时.我经常将它们用于匿名事件处理程序:
button1.Click += (sender, e) => { /* Do Some Work */ }
Run Code Online (Sandbox Code Playgroud)
谓词 - 当你想要一个特殊版本的Func,它根据一组条件评估一个值并返回一个布尔结果(匹配为true,否则为false).同样,这些在LINQ中经常用于像Where这样的东西:
var filteredResults =
someCollection.Where(x => x.someCriteriaHolder == someCriteria);
Run Code Online (Sandbox Code Playgroud)
我只是仔细检查,结果是LINQ不使用Predicates.不确定他们为什么做出这个决定......但理论上它仍然是谓词适合的情况.
归档时间: |
|
查看次数: |
324902 次 |
最近记录: |