Объяснение Func

Мне было интересно, может ли кто-нибудь объяснить, что Func<int, string> и как он используется с некоторыми ясными примерами.

Ответ 1

Вы знакомы с делегатами в целом? У меня есть страница о делегатах и ​​событиях, которые могут помочь, если нет, хотя она больше ориентирована на объяснение различий между ними.

Func<T, TResult> - это всего лишь общий делегат - выясните, что это означает в какой-либо конкретной ситуации, заменив параметры типа (T и TResult) с соответствующими аргументами типа (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

Ответ 2

A Func<int, string> ест ints и возвращает строки. Итак, что ест ints и возвращает строки? Как насчет этого...

public string IntAsString( int i )
{
  return i.ToString();
}

Там я просто создал функцию, которая ест ints и возвращает строки. Как я буду использовать его?

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 ест ints и возвращает строки).

Этот пример не очень сексуальный, но тонна умных вещей, которые вы увидите, основана на простой идее функций, делегатов и методы расширения.

Один из лучших праймеров на этом материале, который я видел, - здесь. Он получил гораздо более реальные примеры.:)

Ответ 3

Это делегат, который принимает один 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();
    }
}