Мне было интересно, может ли кто-нибудь объяснить, что Func<int, string>
и как он используется с некоторыми ясными примерами.
Объяснение Func
Ответ 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();
}
}