90

誰かがFunc<int, string>明確な例で何が何で、どのように使用されているかを説明できるかどうか疑問に思っていました.

4

4 に答える 4

147

一般的にデリゲートに精通していますか? デリゲートとイベントに関するページがありますが、そうでない場合でも役立つかもしれませんが、両者の違いを説明することを目的としています.

Func<T, TResult>は単なるジェネリック デリゲートです。宣言内の型パラメーター( Tand TResult) を対応する型引数( intand ) に置き換えることで、特定の状況での意味を理解してください。stringまた、混乱を避けるために名前を変更しました。

string ExpandedFunc(int x)

つまり、引数を取り、 を返すFunc<int, string>関数を表すデリゲートです。intstring

Func<T, TResult>射影と述語の両方に LINQ でよく使用されます (後者の場合TResultは always bool)。たとえば、 aを使用しFunc<int, string>て、整数のシーケンスを文字列のシーケンスに射影できます。ラムダ式は通常、関連するデリゲートを作成するために LINQ で使用されます。

Func<int, string> projection = x => "Value=" + x;
int[] values = { 3, 7, 10 };
var strings = values.Select(projection);

foreach (string s in strings)
{
    Console.WriteLine(s);
}

結果:

Value=3
Value=7
Value=10
于 2009-05-18T16:53:45.130 に答える
41

AFunc<int, string>はintを食べ、文字列を返します。では、何がintを食べて文字列を返すのでしょうか?これはどう ...

public string IntAsString( int i )
{
  return i.ToString();
}

そこで、intを食べて文字列を返す関数を作成しました。どのように使用しますか?

var lst = new List<int>() { 1, 2, 3, 4, 5 };
string str = String.Empty;

foreach( int i in lst )
{
  str += IntAsString(i);
}

// str will be "12345"

あまりセクシーではありませんが、それは多くのトリックが基づいている単純なアイデアです。それでは、代わりにFuncを使用しましょう。

Func<int, string> fnc = IntAsString;

foreach (int i in lst)
{
  str += fnc(i);
}

// str will be "1234512345" assuming we have same str as before

各メンバーでIntAsStringを呼び出す代わりに、fncという名前の参照を作成し(これらのメソッドへの参照はデリゲートと呼ばれます)、代わりにそれを使用しました。(fncはintを食べ、文字列を返すことを忘れないでください)。

この例はそれほどセクシーではありませんが、表示される多くの巧妙なものは、関数、デリゲート、および拡張メソッドの単純なアイデアに基づいています。

私が見たこのようなものの最高の入門書の1つはここにあります。彼にはもっと多くの実例があります。:)

于 2009-05-18T17:18:19.447 に答える
29

int1 つをパラメーターとして取り、 type の値を返すデリゲートですstring

以下はその使用例です。

using System;

class Program
{
    static void Main()
    {
        Func<Int32, String> func = bar;

        // now I have a delegate which 
        // I can invoke or pass to other
        // methods.
        func(1);
    }

    static String bar(Int32 value)
    {
        return value.ToString();
    }
}
于 2009-05-18T16:48:51.363 に答える