この質問にはすでに答えがあります。
実際の例とその使用法で、誰かが私を理解するのを手伝ってください。
違いは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
。
Predicate
関数シグネチャ内渡されたメソッドが単に成功コードや別の種類のコードを返すのではなく、決定を下すことを示しています。bool
。 - Ron WarholicPredicate<T>
またはFunc<T,bool>
?の表現力が好きPredicate
の推奨事項を確認しましたFunc
も。 - CodesInChaosFunc
しかし、これは一貫性を保つためのものです。Func<T,bool>
述語としても過負荷を取っているFunc<T,int,bool>
インデックス付き述語の場合。 - Jon Skeet
アクションメソッドへのデリゲート(ポインタ)です。これは、0個、1個以上の入力パラメータを取りますが、何も返しません。
機能メソッドへのデリゲート(ポインタ)です。ゼロ、1つ以上の入力パラメータを取り、値(または参照)を返します。
述語比較によく使われる特別な種類の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;
}
}
機能 - パラメータを取り込むかどうかにかかわらず、値を返す関数のデリゲートが必要な場合。最も一般的な例は、Select from LINQです。
var result = someCollection.Select( x => new { x.Name, x.Address });
アクション - パラメータを使用する場合と使用しない場合があり、値を返さない関数のデリゲートが必要な場合。私は匿名のイベントハンドラにこれらを頻繁に使用します。
button1.Click += (sender, e) => { /* Do Some Work */ }
述語 - 一連の基準に対して値を評価し、ブール値の結果を返す特殊なバージョンのFuncが必要な場合(一致した場合はtrue、それ以外の場合はfalse)。繰り返しになりますが、これらはLINQで、次のような目的で頻繁に使用されています。
var filteredResults =
someCollection.Where(x => x.someCriteriaHolder == someCriteria);
二重チェックしたところ、LINQは述語を使用していません。なぜ彼らがその決断をしたのかわからない…でも理論的にはそれでもPredicateが当てはまる状況である。