5

Action<T>, Func<T> and Predicate<T>WPF/MVVM 学習の一環として、デリゲートの違いを理解しようとしています。

Action<T> and Func<T>どちらもゼロから1つ以上のパラメーターを取りFunc<T>、値を返すだけで、値を返さないことを知っAction<T>ています。

についてPredicate<T>は、わかりません。

したがって、私はこの次の質問を思いつきました:

  1. 何をしPredicate<T>ますか?(例を歓迎します!)
  2. ifが何もAction<T>返さないvoid場合、代わりに使用する方が簡単ではないでしょうか? Func<T>(または、話しているのであれば他のタイプです。)

質問で LINQ/List の例を避けてください。
私はすでにそれらを見てきましたが、これらのデリゲートに「興味を持った」コードはそれとは何の関係もないので、混乱を招くだけです (私は思います!)。
したがって、私はよく知っているコードを使用して答えを得たいと思います。

ここにあります:

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);
}
}

注:
非常に長いコード ブロックを避けるために、コメントを削除しました。
完全なコードはHEREにあります。

どんな助けでも大歓迎です!ありがとう!:)

PS: 他の質問を私に向けないでください。検索しようとしましたが、理解できるほど簡単なものは見つかりませんでした。

4

6 に答える 6

9

Predicate<T>Tを受け取り、を返すデリゲートですbool
と完全に同等Func<T, bool>です。

違いは、すべてのデリゲートが .Net 3.5 で追加されたPredicate<T>のに対し、.Net 2.0 で追加されたことです。Func<*>(.Net 4.0 で追加された 8 つ以上のパラメーターを持つものを除く)

List<T>( FindAll()TrueForAll()など)の LINQ に似たメソッドはPredicate<T>s を取ります。

2 番目の質問に答えるにvoidは、ジェネリック パラメーターとして使用できません。

于 2013-01-01T13:33:37.897 に答える
1

プレディケートは何をしますか? (例を歓迎します!)

を返す必要がありboolean、条件付き構造で使用されます。と同等です (ただし、割り当てはできません) Func<T, bool>Predicate は主に、FindAll や RemoveAll などのメソッドの List で使用されます。

Action<T>Func<T,bool>

void を返す関数を として表すことはできませんFunc<void, T>。必須Action<T>です。type はジェネリックVoidでは使用できません。

于 2013-01-01T13:34:20.600 に答える
1
Func<T,bool> and Predicate<T> 

同じデリゲートの傾向があります。しかし、Predicate は、Func や Action がなかった最初からデリゲート Type であったため、Kindof traditional です。Array 、List などのクラスの FindAll/Find メソッドが表示される場合、Predicate を使用します。Predicates は bool のみを返しますが、Func は指定した任意の型を返すことができるため、bool も含まれます。

于 2013-01-01T13:49:53.363 に答える
1

プレディケートは何をしますか? (例を歓迎します!)

Predicate は、引数を取り、bool を返す関数です。x > 20

Action が何も返さない場合は、代わりに void を使用する方が簡単ではないでしょうか? (または、私たちが話している Func の場合は、他の型です。)

アクションは、void を返すデリゲートとして定義されます。ここで、なぜ 2 種類のデリゲートがあるのか​​という議論が起こるかもしれませんが、単純に、それは設計の結果です。別のアプローチは、何もしないFuncリターンを持つことUnitです。

于 2013-01-01T13:40:00.830 に答える
0

Predicate は、T を受け取ってブール値を返すデリゲートであり、本質的にはフィルタリング関数です。または、それが主に使用するものです。

Linq の Where() 拡張メソッドを使用すると、Predicate デリゲートをパラメーターとして受け取ることがわかります。また、Predicate を使用して、より複雑なフィルタリング メソッドを式として作成し、複数の Predicate デリゲートを AND または OR 条件で動的に組み合わせることができます。 .

たとえば、ユーザーが複数のパラメーターを動的に選択してレポート ページのコンテンツをカスタマイズできるレポート ページを WPF で作成する必要がありました。選択したフィールドなどに含まれている)、述語を組み合わせて式にコンパイルし、後でユーザーに表示したデータのコレクションをフィルタリングするために使用しました。


編集: これを確認してください -なぜ Predicate<T> ではなく Func<T,bool> なのですか?

要するに: コーディング ガイドラインでは、Predicates を使用せず、代わりに Func を使用するように規定されています。

于 2013-01-01T13:35:27.763 に答える
-1

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>登場する前に導入された、本当に特殊なケースにすぎません。私たちがすでにとを持っていたら、さまざまな形で導入されなかっただろうと思います...ただし、 と の使用には特定の意味が与えられますが、とは広く異なる目的に使用されます。FuncActionFuncActionPredicatedelegateFuncAction

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

于 2013-01-01T13:39:05.937 に答える