2016-05-02 9 views
25

मैंने हाल ही में सी # के साथ काम करना शुरू कर दिया है और कुछ ऐसा है जो मैं पाइथन में आसानी से करने के लिए करता था जिसे मैं सी # में प्राप्त करना चाहता हूं।शब्दकोश और कार्य

def my_func(): 
return "Do some awesome stuff" 

और की तरह एक शब्दकोश:

my_dic = {"do": my_func} 

मैं एक स्क्रिप्ट बना दिया है जिसमें उपयोगकर्ता हैं इनपुट "do" जब, कार्यक्रम

उदाहरण के लिए, मैं की तरह एक समारोह है शब्दकोश के अनुसार my_func पर कॉल करेगा।

मैं जानना चाहता हूं कि मैं सी # शब्दकोश में तारों को फ़ंक्शंस कैसे सौंप सकता हूं।

+0

@ सियावशममी: नहीं, आप नहीं करते हैं। आपको केवल मानक 'एक्शन' या 'फनक' जैसे प्रतिनिधियों की आवश्यकता है। या 'अभिव्यक्ति'। निस्संदेह वे सभी आंतरिक रूप से प्रतिबिंब पर आधारित हैं, क्योंकि 'MethodInfo' इनमें से प्रत्येक के अंदर कहीं है, लेकिन यह मैन्युअल रूप से खोजने/आमंत्रित करने जैसा कुछ भी नहीं है। – quetzalcoatl

+2

यह भी देखें: [प्रतिनिधि] (https://msdn.microsoft.com/library/ms173171.aspx) और विशेष रूप से जेनेरिक प्रतिनिधि प्रकारों में निर्मित [एक्शन] (https://msdn.microsoft.com/library/system। action.aspx) ('शून्य 'रिटर्न प्रकार वाले विधियों के लिए) और [Func] (https://msdn.microsoft।कॉम/डी-डी/लाइब्रेरी/बीबी 534 9 60.aspx) (गैर-'void' रिटर्न प्रकार वाले विधियों के लिए) और उनके कई अधिभार। – Corak

उत्तर

50
मूल रूप से एक ही तरीके से

:

static void Main() { 
    var dict = new Dictionary<string, Action>(); 
    // map "do" to MyFunc 
    dict.Add("do", MyFunc); 
    // run "do" 
    dict["do"](); 
} 

static void MyFunc() { 
    Console.WriteLine("Some stuff"); 
} 
+3

आप लैम्ब्डा अभिव्यक्ति भी कर सकते हैं: 'dict.Add (" do ",() => कंसोल। राइटलाइन (" कुछ सामान "));'। यहां कुंजी यह है कि 'एक्शन' एक प्रतिनिधि प्रकार है, और यह निर्दिष्ट करता है कि फ़ंक्शन को कोई पैरामीटर नहीं लेना चाहिए और कोई परिणाम नहीं देना चाहिए। 'एक्शन' के अन्य, जेनेरिक संस्करण हैं जो तर्क लेने की अनुमति देते हैं, और 'Func' एक मान वापस करने की अनुमति देता है। यह भी ध्यान देने योग्य है कि इसके लिए काम करने के लिए, सभी कार्यों को समान पैरामीटर सेट और आउटपुट के प्रकार की आवश्यकता होती है। – jpmc26

+1

पायथन सी # के विपरीत रास्ते में multiline lambdas है:() => {Console.WriteLine ("ए"); Console.WriteLine ("बी"); }, क्योंकि यह अपने निर्माता की "आंत महसूस" से सीमित नहीं है। – Traubenfuchs

+0

@Traubenfuchs पाइथन के लिए उचित होने के लिए, आप किसी भी दायरे में 'डीएल' के माध्यम से किसी भी दायरे में बहुमुखी कार्य कर सकते हैं (मुझे विश्वास है) 'लैम्ब्डा' भाषा में जोड़ा गया था। तो सीमा तब समझ में आती है जब आप 'लैम्ब्डा' को बहुत सरल संचालन को रेखांकित करने की सुविधा मानते हैं और तथ्य यह है कि बहु-अभिव्यक्ति लैम्बडा शायद या तो अत्यधिक पार्सिंग जटिल हो या सिंटैक्स तत्वों के टन की आवश्यकता हो। इसके विपरीत, आप निश्चित रूप से सी # के साथ फ़ंक्शन स्कोप में सामान्य फ़ंक्शंस (जो कक्षाओं के कुछ हिस्सों हैं) को परिभाषित नहीं कर सकते हैं, इसलिए लैम्ब्डा फ़ंक्शन पाइथन में किए गए सी # में अधिक भूमिकाएं भरते हैं। – jpmc26

18

आप यहाँ संग्रह प्रारंभकर्ता वाक्य रचना का लाभ ले सकते।

var my_dic = new Dictionary<string, Action> 
{ 
    { "do", my_func } 
}; 

अधिक परिष्कृत कार्यों के लिए, आप उचित Function प्रकार के साथ घोषणा में Action की जगह होगी।

+0

मामूली मामलों के लिए आप संग्रह प्रारंभकर्ता में लैम्ब्डा सिंटैक्स का भी उपयोग कर सकते हैं (और कुछ मामलों में बस विधि समूह का नाम लिखें) – kai

5

सी # कोड के टुकड़े है कि ज्यादातर सीधे अनुरूप अपने उदाहरण के लिए जा सकते:

string my_func() { 
    return "Do some awesome stuff"; 
} 

और:

var my_dic = new Dictionary<string, Func<string>> { 
    { "do", my_func }, 
}; 

चाल, के रूप में अन्य पोस्टर ने बताया है, एक बनाने के लिए है स्ट्रिंग जिसका सामान्य मूल्य प्रकार या तो एक क्रिया है (जो एक विधि है जो शून्य लौटाती है) या एक Func < टी > (जो एक तरीका है जो प्रकार टी का ऑब्जेक्ट देता है)।

var result = my_dic["do"](); 
+0

मैंने अपना जवाब जोड़ा, इव्स और एडम ई के जवाबों के समान होने के बावजूद, उनमें से कोई भी प्रदान नहीं किया गया बाल्गी द्वारा प्रदान किए गए उदाहरण के प्रत्यक्ष कोड एनालॉग। –

2

आप वास्तव में अजगर के गतिशील व्यवहार चाहते हैं (यानी मूल आवंटित करते हैं और "शब्दकोश में तरीकों अलग हस्ताक्षर है कि कॉल करने के लिए सक्षम किया जा रहा:

या तो मामले में, आप तो साथ विधि पर अमल कर सकता है "), मैं ExpandoObject के साथ जाऊंगा जो विशेष रूप से सीएलआर समर्थन पाइथन जैसे गतिशील भाषाओं (आयरनपीथन, एट अल देखें) के लिए सक्षम था।

static void Main() 
{ 
    dynamic expando = new ExpandoObject(); 
    expando.Do = new Func<string>(MyFunc); 
    expando.Do2 = new Func<string, string>(MyFunc2); 

    Console.WriteLine(expando.Do()); 
    Console.WriteLine(expando.Do2("args")); 
} 

static string MyFunc() 
{ 
    return "Do some awesome stuff"; 
} 

static string MyFunc2(string arg) 
{ 
    return "Do some awesome stuff with " + arg; 
} 

आप चाहें, तो आप भी एक शब्दकोश के रूप में एक ExpandoObject इलाज कर सकते हैं:

static void Main(string[] args) 
{ 
    dynamic expando = new ExpandoObject(); 
    var dict = (IDictionary<string, object>) expando; 
    dict["Do"] = new Func<string>(MyFunc); 
    dict["Do2"] = new Func<string, string>(MyFunc2); 

    Console.WriteLine(expando.Do()); 
    Console.WriteLine(expando.Do2("args")); 
} 

static string MyFunc() 
{ 
    return "Do some awesome stuff"; 
} 

static string MyFunc2(string arg) 
{ 
    return "Do some awesome stuff with " + arg; 
} 

** संपादित करें **

पूर्ण प्रकटीकरण: यह सवाल बहुत समान लगती है (अगर नहीं एक शिकार) String- Function dictionary c# where functions have different arguments, जो मैंने अभी भी उसी तरह उत्तर दिया।

संबंधित मुद्दे