web-dev-qa-db-ja.com

Funcの説明

誰かがFunc<int, string>は、いくつかの明確な例で使用される方法です。

87
zSynopsis

デリゲート全般に精通していますか? デリゲートとイベント についてのページがあります。これはそうでない場合に役立ちますが、2つの違いを説明することを目的としています。

Func<T, TResult> は単なる一般的なデリゲートです。特定の状況でtypeパラメーターを置き換えることで意味を理解しますTおよびTResult)に対応するtype引数intおよびstring)を宣言に含めます。また、混乱を避けるために名前を変更しました。

string ExpandedFunc(int x)

言い換えると、 Func<int, string>は、int引数を取り、stringを返す関数を表すデリゲートです。

Func<T, TResult>は、投影と述語の両方でLINQでよく使用されます(後者の場合、TResultは常にboolです)。たとえば、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
138
Jon Skeet

Func<int, string>は整数を食べ、文字列を返します。それでは、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つは、 ここ です。彼にはもっと多くの実例があります。 :)

40
JP Alioto

これは、パラメーターとして1つのintを取り、タイプ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();
    }
}
26
Andrew Hare

Func<int, string>はint値パラメーターを受け入れ、ストリング値を返します。追加のサポート方法が不要な例を次に示します。

Func<int, string> GetDogMessage = dogAge =>
        {
            if (dogAge < 3) return "You have a puppy!";
            if (dogAge < 7) return "Strong adult dog!";

            return "Age is catching up with the dog!";
        };

string youngDogMessage = GetDogMessage(2);

注:Funcの最後のオブジェクトタイプ(この例では「文字列」)は、関数の戻り値のタイプ(つまり、プリミティブに限定されず、任意のオブジェクト)です。したがって、Func<int, bool, float>は、intおよびbool値のパラメーターを受け入れ、float値を返します。

Func<int, bool, float> WorthlessFunc = (intValue, boolValue) =>
        {
            if(intValue > 100 && boolValue) return 100;

            return 1;
        };
float willReturn1 = WorthlessFunc(21, false);
float willReturn100 = WorthlessFunc(1000, true);

HTH

1
jts