फंक की व्याख्या


89

मैं सोच रहा था कि क्या कोई समझा सकता है कि Func<int, string>कुछ स्पष्ट उदाहरणों के साथ इसका क्या और कैसे उपयोग किया जाता है।

जवाबों:


145

क्या आप सामान्य रूप से प्रतिनिधियों से परिचित हैं? मेरे पास प्रतिनिधियों और घटनाओं के बारे में एक पृष्ठ है जो यदि नहीं तो मदद कर सकते हैं, हालांकि यह दोनों के बीच के अंतर को समझाने की दिशा में अधिक सक्षम है।

Func<T, TResult>केवल एक सामान्य प्रतिनिधि है - घोषणा में संबंधित प्रकार के तर्कों ( और ) के साथ टाइप पैरामीटर ( Tऔर TResult) को बदलकर किसी भी विशेष स्थिति में इसका क्या अर्थ है, इसका पता लगाएं । मैंने भ्रम से बचने के लिए इसका नाम भी बदल दिया है:intstring

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

3
"दूसरे शब्दों में, यह एक प्रतिनिधि है जो एक फ़ंक्शन का प्रतिनिधित्व करता है जो एक अंतर तर्क ले रहा है और एक स्ट्रिंग लौटा रहा है।" बस दूसरों के लिए भ्रम से बचने के लिए मैं स्पष्ट कर दूंगा कि आप यहां Func <int, string> के बारे में बात कर रहे हैं न कि Func <T, TResult>। यह स्पष्ट है कि यदि आप सामान्य प्रकार और प्रतिनिधियों को समझते हैं, लेकिन न तो यह फंक है <int, string> कि एक प्रतिनिधि को एक समारोह में ले जाता है जो एक int तर्क लेता है और एक स्ट्रिंग देता है।
असली नैपस्टर

बाद में जब मैं पीसी पर वापस आऊंगा तो स्पष्ट कर दूंगा।
जॉन स्कीट

2
मुझे लगता है कि यह वास्तव में MSDN के वर्णन और उदाहरण के रूप में स्पष्ट नहीं है। मुझे यह भी लगता है कि आपको इस बारे में जानकारी जोड़नी चाहिए कि अंतिम प्रकार परम कैसे रिटर्न प्रकार है - यह स्पष्ट करते हुए कि फंक <int, int, string> रिटर्न स्ट्रिंग और 2 ints लेता है। यह स्पष्ट करने में मदद करता है। कुछ भी व्यक्तिगत नहीं - मुझे नहीं लगता कि यह पर्याप्त स्पष्ट था।
theSoftwareJedi

11
तो क्या आप हर उस उत्तर को अस्वीकार करने जा रहे हैं जिसे आप अपने विशेष पसंदीदा के रूप में उपयोगी नहीं मानते हैं? क्या यह उत्तर सक्रिय रूप से अप्राप्य है , क्या आपको लगता है? क्या आपको लगता है कि शायद चीजों को देखने के एक से अधिक तरीके होने से बुरा विचार नहीं हो सकता है?
जॉन स्कीट

8
@TheSoftwareJedi: नहीं, बेशक, व्यक्तिगत रूप से आपके डाउनवोट को लेने का कोई कारण नहीं है - यह तथ्य कि आपने शनिवार को व्यक्तिगत कारणों से डाउनवोट किया और फिर उचित व्यवहार के बारे में ईमेल पर लंबी चर्चा होने के बाद बस इस धागे में आने के लिए हुआ। है पूरी तरह से संयोग है, है न?
जॉन स्कीट

40

एक 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 और रिटर्न स्ट्रिंग्स खाता है)।

यह उदाहरण बहुत सेक्सी नहीं है, लेकिन आप जो चालाक सामान देखेंगे उसका एक टन कार्य, प्रतिनिधियों और विस्तार विधियों के सरल विचार पर आधारित है ।

मैंने देखा है इस सामान पर सबसे अच्छा प्राइमरों में से एक यहाँ है । उन्हें बहुत अधिक वास्तविक उदाहरण मिले हैं। :)


@Therealnapster मुझे भी यह पसंद है लेकिन मुझे आपका नाम अधिक पसंद है।
बीकेएसपूर्जन

27

यह एक प्रतिनिधि है जो 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();
    }
}

3
धन्यवाद क्या आपको बार (1) के बजाय फंक (1) लिखने का मतलब था?
zSynopsis

1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.