820

実際の例とその使用法について、誰かが私が理解するのを手伝ってくれませんか。

  1. Func<T, ..>いつ代理人が必要ですか?
  2. Action<T>いつ代理人が必要ですか?
  3. Predicate<T>いつ代理人が必要ですか?
4

3 に答える 3

1025

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, ...)

ActionList<T>.ForEachリスト内の各アイテムに対して指定されたアクションを実行します。これは よりも頻繁には使用しFuncませが、 や などにはパラメーターなしのバージョンを使用することがControl.BeginInvokeありDispatcher.BeginInvokeます。

Predicateは、すべての、そしてほとんどのデリゲートがFunc<T, bool>登場する前に導入された、本当に特殊なケースにすぎません。私たちがすでに持っていて、さまざまな形で導入されていたら、導入されなかったと思います...ただし、デリゲートの使用には特定の意味がありますが、は広く異なる目的に使用されます。FuncActionFuncActionPredicateFuncAction

Predicateや などList<T>のメソッドで主に使用されます。FindAllRemoveAll

于 2010-11-30T19:11:43.050 に答える
428

アクションはメソッドへのデリゲート (ポインター) であり、ゼロ、1 つ、または複数の入力パラメーターを受け取りますが、何も返しません。

Funcはメソッドへのデリゲート (ポインター) であり、ゼロ、1 つ、または複数の入力パラメーターを取り、値 (または参照) を返します。

Predicateは、比較によく使用される特別な種類の Func です (汎用パラメーターを取り、bool を返します)。

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;
    }
}
于 2012-10-02T09:28:51.560 に答える
67

Func - パラメータを受け取る場合と取らない場合があり、値を返す関数のデリゲートが必要な場合。最も一般的な例は、LINQ からの選択です。

var result = someCollection.Select( x => new { x.Name, x.Address });

アクション- パラメータを取る場合と取らない場合があり、値を返さない関数のデリゲートが必要な場合。私はこれらを匿名イベント ハンドラーによく使用します。

button1.Click += (sender, e) => { /* Do Some Work */ }

Predicate - 一連の基準に対して値を評価し、ブール値の結果を返す特別なバージョンの Func が必要な場合 (一致の場合は true、それ以外の場合は false)。繰り返しますが、これらは LINQ で次のような目的で非常に頻繁に使用されます。

var filteredResults = 
    someCollection.Where(x => x.someCriteriaHolder == someCriteria);

再確認したところ、LINQ は述語を使用していないことがわかりました。彼らがその決定を下した理由はわかりません...しかし、理論的には、述語が適合する状況は依然としてあります。

于 2010-11-30T19:13:50.840 に答える