Can someone explain what the C# “Func<T,T>” does?

孤者浪人 提交于 2019-11-28 18:10:55

A Func<int, string> like

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

is a delegate accepting int as its sole parameter and returning a string. In this example, it accepts an int parameter with name i and returns the string "Page" + i which just concatenates a standard string representation of i to the string "Page".

In general, Func<TSource, TResult> accepts one parameter that is of type TSource and returns a parameter of type TResult. For example,

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

then you can say

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

or

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

so you can say

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

Func<int, String> means a callback method that takes an int parameter and returns a String as the result.

The following expression, which is known as a lambda expression:

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

expands to something like this:

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

The Func<int, string> line that you are inquiring about is known as a lambda expression.

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

This line can be described as a function that takes an int parameter (i) and returns a string "Page" + i;

It can be re-written as:

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

Because the PageLinks method is an Extension Method.

In extension method, the first parameter starts with this keyword to indicate that it is an Extension method on the type represented by the first parameter.

The Func<T1, T2> is a delegate which represents a transformation from type T1 to type T2. So basically, your PageLinks method will apply that transformation to int to produce a string.

Func<T, TResult>: Encapsulates a method that has one parameter and returns a value of the type specified by the TResult parameter. See this page for more details and examples. :-)

Have a blog post on this. Using Func you can resolve some of functional discrepancy. Read here.

I have implemented a where() extension method using Func please have a look...

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;
        }
    }
}

You can use it like,

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

Create your own

Func<int,string> myfunc; 

then right click Func to view definition. You will see it is a delegate underneith

public delegate TResult Func<in T, out TResult>(T arg);
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!