मैं सोच रहा था कि क्या कोई समझा सकता है कि 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
एक 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 का उपयोग करें।
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>
एक इंट वैल्यू पैरामीटर स्वीकार करता है और एक स्ट्रिंग मान लौटाता है। यहां एक उदाहरण है जहां एक अतिरिक्त सहायक विधि अनावश्यक है।
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<int, bool, float>
इंट और बूल मान मापदंडों को स्वीकार करता है, और एक फ्लोट मूल्य देता है।
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