2012-11-16 16 views
8

मुझे आश्चर्य है कि यह एक शब्दकोश के लिए कुंजी का एक विकल्प पसंद है या नहीं?शब्दकोश Func के साथ कुंजी

var map3 = new Dictionary<Func<int, bool>, int>(); 
    map3.Add((x) => x % 2 == 0, 1); 
    map3.Add((x) => x % 10 == 0, 2); 
    // ... 

    var key = map3.Keys.SingleOrDefault(f => f(2)); 
    // key = (x) => x % 2 
    // map3[key] = 1 

विचार यह किया जा रहा है बड़ा अगर-बाकी या स्विच बयान की तुलना में एक क्लीनर तरीका है: मुझे क्या करना चाहते हैं एक शब्दकोश में कुंजी, की तरह कुछ के रूप में एक अभिव्यक्ति का उपयोग करें।

क्या यह समझ में आता है? क्या ये काम करेगा? क्या कोई आसान तरीका है?

+1

एक शब्द में; नहीं। यह अक्सर एक उचित मूल्य है, लेकिन एक कुंजी के रूप में मैं इसे टालना होगा। – Servy

+2

.. यह मेरा सिर बनाए रखने में मेरा सिर करेगा .. –

उत्तर

7

नहीं, सी # जब भी लैम्ब्डा का उपयोग किया जाता है तो एक नया प्रतिनिधि उदाहरण बनाता है ताकि आप इसे लगातार कुंजी के रूप में उपयोग करने में सक्षम न हों। उदाहरण:

 Func<int, int> f = x => x*x + 1; 
     Func<int, int> g = x => x*x + 1; 
     Console.WriteLine(f.Equals(g)); // prints False 

यह तो उपयोग एक शब्दकोश कुंजी के रूप में अजीब होगा जब तक आप किसी अन्य तरीके से हमेशा एक ही उदाहरण प्राप्त करने के लिए किया था।

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

एरिक Lippert के जवाब here इंगित करता है संकलक पता लगाने के लिए ही कर रहे हैं lambdas अनुमति है कि (हालांकि यह आम तौर पर नहीं करता है)। किसी भी तरह से एक लैम्ब्डा/प्रतिनिधि एक कुंजी के लिए एक गरीब पसंद बनाता है।

+0

ठीक है धन्यवाद, यह – user380689

6

अपने मानचित्र का उपयोग करने के तरीके को ध्यान में रखते हुए, आप List<Tuple<Func<int,bool>,int>> के साथ बेहतर हो जाएंगे, क्योंकि लैम्ब्स की जांच करने का क्रम अब हैश-आधारित शब्दकोश में मनमाने ढंग से नहीं होगा। यह दृष्टिकोण आपको लुकअप चरण को छोड़ने देता है:

var map3 = new List<Tuple<Func<int,bool>,int>> { 
    new Tuple<Func<int,bool>,int>((x) => x % 2 == 0, 1) 
, new Tuple<Func<int,bool>,int>((x) => x % 10 == 0, 2) 
}; 
var t = map3.SingleOrDefault(t => t.Item1(2)); 
if (t != null) { 
    var v = t.Item2; 
} 
+0

हम्म को मंजूरी दे दी है, दिलचस्प है कि मुझे इसे और अधिक पढ़ने की आवश्यकता है। धन्यवाद। – user380689

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