Вопрос
Мне было интересно, может ли кто-нибудь объяснить, что Func<int, string>
есть и как это используется с некоторыми наглядными примерами.
Решение
Знакомы ли вы с делегатами в целом?У меня есть страница о делегаты и мероприятия который может помочь, если нет, хотя он больше ориентирован на объяснение различий между ними.
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
Другие советы
A Func<int, string>
потребляет целые числа и возвращает строки.Итак, что потребляет целые числа и возвращает строки?Как насчет этого ?..
public string IntAsString( int i )
{
return i.ToString();
}
Там я только что создал функцию, которая использует целые числа и возвращает строки.Как бы я это использовал?
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<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 использует целые числа и возвращает строки).
Этот пример не очень привлекательный, но тонна умных вещей, которые вы увидите, основана на простой идее функций, делегатов и методы расширения.
Один из лучших праймеров по этому материалу, который я видел, это здесь.У него есть гораздо больше реальных примеров.:)
Это делегат , который принимает одно 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();
}
}
Func<int, string>
принимает параметр int value и возвращает строковое значение.Вот пример, когда дополнительный вспомогательный метод не требуется.
Func<int, string> GetDogMessage = dogAge =>
{
if (dogAge < 3) return "You have a puppy!";
if (dogAge < 7) return "Strong adult dog!";
return "Age is catching up with the dog!";
};
string youngDogMessage = GetDogMessage(2);
ПРИМЕЧАНИЕ:Последний тип объекта в Func (т.е."string" в этом примере) - это возвращаемый функциями тип (т.е.не ограничиваясь примитивами, но любым объектом).Следовательно, Func<int, bool, float>
принимает параметры значений int и bool и возвращает значение с плавающей запятой.
Func<int, bool, float> WorthlessFunc = (intValue, boolValue) =>
{
if(intValue > 100 && boolValue) return 100;
return 1;
};
float willReturn1 = WorthlessFunc(21, false);
float willReturn100 = WorthlessFunc(1000, true);
HTH