39

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>")           

}

編集:この質問のポイントを混乱させた部分を削除しました。

問題は、なぜこの例で Func を使用しているのかということです。いつ使用すればよいですか?ファンクとは?

ありがとう!

4

8 に答える 8

106

いいFunc<int, string>

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

int唯一のパラメーターとして受け取り、 を返すデリゲートstringです。この例では、intname のパラメーターを受け取り、の標準的な文字列表現を string に連結しただけiの文字列を返します。"Page" + ii"Page"

通常、Func<TSource, TResult>type のパラメーターを 1 つ受け取り、 typeTSourceのパラメーターを返します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));
于 2011-03-15T17:26:38.193 に答える
13

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

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

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

次のように展開します。

Func<int, String> pageUrl = delegate(int i)
{
    return "Page" + i;
}
于 2011-03-15T17:25:36.240 に答える
3

Func<int, string>お問い合わせの行は、ラムダ式として知られています。

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

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

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

delegate(int i)
{
    return "Page" + i;
}
于 2011-03-15T17:26:33.110 に答える
1

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

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

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

于 2011-03-15T17:25:15.800 に答える
1

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

于 2011-03-15T17:27:00.253 に答える
0

自分で作る

Func<int,string> myfunc; 

次に Func を右クリックして定義を表示します。下にデリゲートがあることがわかります

public delegate TResult Func<in T, out TResult>(T arg);
于 2014-11-13T06:42:10.710 に答える
0

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 );
        }
于 2014-04-07T12:50:09.240 に答える