[英]Explanation of Func
我想知道是否有人可以解釋一下Func<int, string>
是什么以及它是如何與一些明顯的例子一起使用的。
你是否熟悉一般的代表? 我有一個關於代表和事件的頁面,如果沒有,可能會有所幫助,盡管它更適合解釋兩者之間的差異。
Func<T, TResult>
只是一個泛型委托 - 通過在聲明中用相應的類型參數 ( int
和string
)替換類型參數 ( T
和TResult
)來解決它在任何特定情況下的含義。 我也重命名它以避免混淆:
string ExpandedFunc(int x)
換句話說, Func<int, string>
是一個委托,它表示一個帶有int
參數並返回一個string
的函數。
Func<T, TResult>
經常用於LINQ,用於投影和謂詞(在后一種情況下, TResult
總是bool
)。 例如,您可以使用Func<int, string>
將一系列整數投影到一系列字符串中。 Lambda表達式通常在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
Func<int, string>
吃掉int並返回字符串。 那么,什么吃int並返回字符串? 這個怎么樣 ...
public string IntAsString( int i )
{
return i.ToString();
}
在那里,我只是編寫了一個吃int並返回字符串的函數。 我該如何使用它?
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吃掉int並返回字符串)。
這個例子不是很性感,但是你會看到很多聰明的東西都是基於函數,委托和擴展方法的簡單概念。
我見過的最好的引物之一就在這里 。 他有更多真實的例子。 :)
它是一個委托,它將一個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值參數並返回字符串值。 這是一個不需要額外支持方法的示例。
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值參數,並返回一個浮點值。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.