Объяснение Func
мне было интересно, если кто-то может объяснить, что Func<int, string>
есть и как он используется с некоторыми четкими примерами.
4 ответа:
знакомы ли вы с делегатами вообще? У меня есть страница о делегаты и события что может помочь, если нет, хотя это больше ориентировано на объяснение различий между ними.
Func<T, TResult>
это просто общий делегат-выясните, что это значит в любой конкретной ситуации, заменив параметры типа (T
иTResult
) с соответствующими аргументы типа (int
иstring
) in декларация. Я также переименовал его, чтобы избежать путаницы:string ExpandedFunc(int x)
другими словами,
Func<int, string>
является делегатом, который представляет функцию, принимающую
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<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 и возвращает строки).
этот пример не очень сексуален, но тонна умных вещей, которые вы увидите, основана на простой идее функций, делегатов и методы расширения.
один из лучших праймеров на этом материале я видел это здесь. У него есть гораздо больше реальных примеров. :)
- Это делегат, который принимает один
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 (т. е. "строка" в этом примере) является типом возвращаемых функций (т. е. не ограничивается примитивами, но любым объектом). Таким образом,
Func<int, bool, float>
принимает параметры int и bool value и возвращает значение с плавающей запятой.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