2012-03-05 10 views
15

संभव डुप्लिकेट:
Custom Collection Initializersकस्टम वर्ग पर बनाएं शब्दकोश शैली संग्रह प्रारंभकर्ता

मैं एक साधारण जोड़ी वर्ग है:

public class Pair<T1, T2> 
    { 
     public Pair(T1 value1, T2 value2) 
     { 
      Value1 = value1; 
      Value2 = value2; 
     } 

     public T1 Value1 { get; set; } 
     public T2 Value2 { get; set; } 
    } 

और सक्षम होने के लिए चाहते हैं इसे एक शब्दकोश ऑब्जेक्ट की तरह परिभाषित करने के लिए, इस तरह की सभी इनलाइन:

var temp = new Pair<int, string>[] 
     { 
      {0, "bob"}, 
      {1, "phil"}, 
      {0, "nick"} 
     }; 

लेकिन यह मुझे एक पूर्ण नई जोड़ी (0, "बॉब") आदि को परिभाषित करने के लिए कह रहा है, मैं इसे कैसे कार्यान्वित करूं?

सामान्य रूप से, धन्यवाद दोस्तों!

+0

अच्छा सवाल! मैंने सही उत्तर शब्दावली (संग्रह प्रारंभकर्ता) का उपयोग करने के लिए आपका उत्तर संपादित किया। यह आम तौर पर चीजों के संग्रह पक्ष पर पूरा होता है (इसमें एक जोड़() विधि होनी चाहिए)। इस मामले में आप एक सरणी का उपयोग कर रहे हैं, इसलिए यह वैसे ही काम नहीं करता है। लेकिन यह देखने में बहुत दिलचस्पी है कि इसे काम करने के तरीके हैं! – MattDavey

+0

'KeyValuePair ' का प्रशंसक नहीं है? या लागू ज्ञान के लिए जा रहे हैं? –

उत्तर

17

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

class PairList<T1, T2> : IEnumerable 
{ 
    private List<Pair<T1, T2>> _list = new List<Pair<T1, T2>>(); 

    public void Add(T1 arg1, T2 arg2) 
    { 
     _list.Add(new Pair<T1, T2>(arg1, arg2)); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return _list.GetEnumerator(); 
    } 
} 

के लिए और फिर आप

var temp = new PairList<int, string> 
{ 
    {0, "bob"}, 
    {1, "phil"}, 
    {0, "nick"} 
}; 
+0

क्या आप सुझाव दे रहे हैं कि 'int [] nums = {1, 2, 3}; 'मान्य सी # मान्य नहीं है? क्योंकि यह है ... निश्चित रूप से समस्या यह है कि जोड़े में ऐड विधि नहीं है? – Chris

+0

@Chris यह शब्दकोश की तरह नहीं है। –

+0

हाँ, और देखकर मैं देख रहा हूं कि समस्या कहां है। मैंने सोचा था कि चूंकि सिंटैक्स मेरी टिप्पणी में काम करता है कि समस्या जोड़ी वस्तु की पीढ़ी के साथ थी। अधिक चीजों को देखने पर (और ऐसा करने के लिए वैध कोड लिखने का प्रयास करने पर) मुझे एहसास हुआ कि मूल पोस्ट द्वारा उपयोग किए जाने वाले वाक्यविन्यास सरणी पर जोड़ें (1, "बॉब") को कॉल करने का प्रयास कर रहा है, जो आप कह रहे थे ' टी मौजूद नहीं है। इसके बारे में खेद है, मैं अगले गरीब मूर्ख के लिए टिप्पणी छोड़ दूंगा जैसा कि मुझे लगता है। :) – Chris

6

Dictionary से प्राप्त होने वाली कक्षा का उपयोग क्यों न करें?

public class PairDictionary : Dictionary<int, string> 
{ 
} 

private static void Main(string[] args) 
{ 
    var temp = new PairDictionary 
    { 
     {0, "bob"}, 
     {1, "phil"}, 
     {2, "nick"} 
    }; 

    Console.ReadKey(); 
} 

आप अपने खुद के संग्रह (मुझे लगता है यह मामला है क्योंकि आप दो मदों के लिए एक ही Value1 है, तो T1 अपने उदाहरण में एक महत्वपूर्ण के रूप में कार्य नहीं करता है) कि Dictionary से विरासत नहीं है बना सकते हैं ।

आप संग्रह प्रारंभकर्ता की वाक्यात्मक चीनी का उपयोग करना चाहते हैं, तो आप एक Add विधि है कि 2 तर्कों (T1 और T2 जो आपके मामले में int और string कर रहे हैं) लेता है प्रदान करने के लिए होगा।

public void Add(int value1, string value2) 
{ 
} 

Custom Collection Initializers

0

वाक्य रचना आप के लिए उद्देश्य यह है कि शब्दकोश के साथ किया जा रहा है द्वारा प्रदान नहीं की है देख रहे हैं कर सकते हैं, यह शब्दकोश संग्रह ही है। यदि आपको संग्रह प्रारंभकर्ता का उपयोग करने में सक्षम होना चाहिए तो आपको किसी मौजूदा संग्रह (जैसे शब्दकोश) का उपयोग करना होगा या इसे घर पर कस्टम संग्रह लागू करना होगा।

नहीं तो आप मूल रूप से करने के लिए सीमित कर रहे हैं:

var temp = new Pair<int, string>[] 
    { 
     new Pair(0, "bob"), 
     new Pair(1, "phil"), 
     new Pair(0, "nick") 
    }; 
2
public class Paircollection<T1, T2> : List<Pair<T1, T2>> 
{ 
    public void Add(T1 value1, T2 value2) 
    { 
     Add(new Pair<T1, T2>(value1, value2)); 
    } 
} 

और फिर

var temp = new Paircollection<int, string> 
{ 
    {0, "bob"}, 
    {1, "phil"}, 
    {0, "nick"} 
}; 

काम करेंगे। अनिवार्य रूप से आप केवल List<Pair<T1,T2>> का एक संस्करण बना रहे हैं जो जानता है कि सही कैसे करें चीज़ें जोड़ें।

यह स्पष्ट रूप से जोड़ी की तुलना में किसी भी अन्य वर्ग के लिए विस्तार योग्य है (जिस तरह से शब्दकोश समाधान नहीं हैं)।

मेरी शुरुआती समझ और मुझे सही दिशा में इंगित करने के लिए लिंक किए गए प्रश्न के साथ मेरी मदद करने के लिए यूरी फकतोरोविच के लिए धन्यवाद।

+1

पैडेंटिक होने के लिए खेद है, लेकिन आपको 'foo' की आवश्यकता नहीं है, आप इसका कभी भी उपयोग नहीं करते हैं। –

+0

पेडेंट्री अनुमोदित और सही। वह एक हैंगओवर था जब मैं विरासत के बजाय सदस्य के रूप में एक सूची का उपयोग कर रहा था। :) – Chris

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