質問

誰かが何を説明してくれるだろうかと思っていました Func<int, string> とは何か、そしてそれがどのように使われるのか、いくつかの明確な例とともに説明します。

役に立ちましたか?

解決

あなたは、一般的には、デリゲートに精通していますか?私は約ページを持っている代表者とされていない場合、それはに対してよりギヤードだが、助けることがのイベント両者の違いを説明する。

Func<T, TResult> のちょうどジェネリックデリゲートである - それが何を意味するのかうまく対応する型パラメータTTResult)を置換することによって、任意の特定の状況で宣言の引数intstring)を入力します。私はまた、混乱を避けるために、それを名前を変更しました。

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

他のヒント

Func<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 つは次のとおりです。 ここ. 。彼はもっとたくさんの実例を持っています。:)

は、パラメータのような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();
    }
}

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とブール値パラメータを受け付け、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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top