web-dev-qa-db-ja.com

誰かがC#の「Func <T、T>」の機能を説明できますか?

私はPro MVC 2の本を読んでおり、HtmlHelperクラスの拡張メソッドを作成する例があります。

ここにコード例:

public static MvcHtmlString PageLinks(this HtmlHelper html, PagingInfo pagingInfo, Func<int,string> pageUrl)
{
    //Magic here.
}

そしてここに使用例があります:

[Test]
public void Can_Generate_Links_To_Other_Pages()
{
    //Arrange: We're going to extend the Html helper class.
    //It doesn't matter if the variable we use is null            
    HtmlHelper html = null;

    PagingInfo pagingInfo = PagingInfo(){
        CurrentPage = 2,
        TotalItems = 28,
        ItemsPerPage = 10
    };

    Func<int, String> pageUrl = i => "Page" + i;

    //Act: Here's how it should format the links.
    MvcHtmlString result = html.PageLinks(pagingInfo, pageUrl);

    //Assert:
    result.ToString().ShouldEqual(@"<a href=""Page1"">1</a><a href=""Page2"">2</a><a href=""Page3"">3</a>")           

}

編集:この質問のpointを混乱させていた部分を削除しました。

問題は、なぜFuncを使用した例なのかです。いつ使用すべきですか? Funcとは何ですか?

ありがとう!

39
delete

Func<int, string>のような

Func<int, String> pageUrl = i => "Page" + i;

intを唯一のパラメーターとして受け入れ、stringを返すデリゲートです。この例では、intという名前のiパラメーターを受け入れ、iの標準文字列表現を文字列"Page" + iに連結した文字列"Page"を返します。

一般に、Func<TSource, TResult>は、TSource型のパラメーターを1つ受け入れ、TResult型のパラメーターを返します。例えば、

Func<string, string> toUpper = s => s.ToUpper();

その後、あなたは言うことができます

string upper = toUpper("hello, world!");

または

Func<DateTime, int> month = d => d.Month;

だからあなたは言うことができます

int m = month(new DateTime(3, 15, 2011));
106
jason

Func<int, String>は、intパラメーターを受け取り、結果としてStringを返すコールバックメソッドを意味します。

ラムダ式 と呼ばれる次の式:

Func<int, String> pageUrl = i => "Page" + i;

このようなものに展開します:

Func<int, String> pageUrl = delegate(int i)
{
    return "Page" + i;
}
13
BoltClock

問い合わせているFunc<int, string>行は、ラムダ式と呼ばれています。

Func<int, String> pageUrl = i => "Page" + i;

この行は、intパラメータ(i)を取り、文字列"Page" + iを返す関数として説明できます。

次のように書き直すことができます。

delegate(int i)
{
    return "Page" + i;
}
3
Kyle Trauberman

これに関するブログ投稿があります。 Funcを使用すると、機能の不一致の一部を解決できます。 こちら をお読みください。

1
nznoor

PageLinksメソッドは 拡張メソッド であるためです。

拡張メソッドでは、最初のパラメーターはこのキーワードで始まり、最初のパラメーターで表される型の拡張メソッドであることを示します。

Func<T1, T2>は、型T1から型T2への変換を表すデリゲートです。したがって、基本的には、PageLinksメソッドはその変換をintに適用してstringを生成します。

1

Func<T, TResult>:1つのパラメータを持つメソッドをカプセル化し、TResultパラメータで指定された型の値を返します。 詳細については、このページを参照してください と例。 :-)

1
Ke Sun

自分で作る

Func<int,string> myfunc; 

次に、Funcを右クリックして定義を表示します。あなたはそれが下層の代理人であることがわかります

public delegate TResult Func<in T, out TResult>(T arg);
0
timothy

Funcを使用してwhere()拡張メソッドを実装しました。ぜひご覧ください...

public static IEnumerable<Tsource> Where<Tsource> ( this IEnumerable<Tsource> a , Func<Tsource , bool> Method )
{

    foreach ( var data in a )
    {
        //If the lambda Expression(delegate) returns "true" Then return the Data. (use 'yield' for deferred return)
        if ( Method.Invoke ( data ) )
        {
            yield return data;
        }
    }
}

次のように使用できます

        foreach ( var item in Emps.Where ( e => e.Name == "Shiv" ).Select ( e1 => e1.Name ) )
        {
            Console.WriteLine ( item );
        }