2009-09-30 11 views
34

मेरे पास कोड में एक स्थिति है जहां Dictionary<string, string> सबसे अच्छा विचार प्रतीत होता है - मुझे इन वस्तुओं का संग्रह चाहिए और मुझे उन्हें एक अद्वितीय कुंजी के माध्यम से सुलभ होने की आवश्यकता है। वास्तव में शब्दकोश अवधारणा क्या है, है ना?सी # शब्दकोश प्रति मूल्य दो मान के साथ?

ठीक है, आवश्यकताओं को उस बिंदु तक विस्तारित किया गया है जहां मुझे अब प्रति-कुंजी (एक बूलियन मान, यदि आप उत्सुक हैं) की अतिरिक्त जानकारी रखने की आवश्यकता है।

तो, मैं स्ट्रिंग और बूलियन के साथ एक नई डेटा संरचना बनाने के लिए अवधारणा का विस्तार करता हूं और अब यह Dictionary<string, NewCustomObject> है।

हालांकि, बूलियन ध्वज की तरह केवल एक अतिरिक्त मूल्य के लिए, यह केवल ओवरकिल जैसा लगता है। और फिर भी मुझे किसी भी शब्दकोश-जैसे जेनेरिक ऑब्जेक्ट के बारे में पता नहीं है जिसमें प्रति मान दो मान हैं।

क्या कस्टम ऑब्जेक्ट्स का एक शब्दकोश सिर्फ इस बारे में जाने का सबसे अच्छा तरीका है या इस परिदृश्य के लिए कुछ आसान है?

+14

शब्दकोश का पहला विचार बिल्कुल अधिक नहीं है। यह सटीक इरादा व्यक्त करता है, दृढ़ता से टाइप किया गया है, इंटेलिजेंस-सक्षम, आसानी से आवश्यकताओं में अगले बदलाव को समायोजित करेगा। –

+1

@ ओरेन ट्रुटनर: अधिक सहमत नहीं हो सकता है। @Schnapple: एक जोड़ी से परेशान न करें, अच्छी तरह से परिभाषित नामों के साथ एक कस्टम ऑब्जेक्ट का उपयोग करें। फ़ील्ड नामों के लिए, उदाहरण के लिए, "Value1" और "Value2" से बचें। उन्हें अर्थपूर्ण अर्थ दें। – Randolpho

+1

ओओ भाषा में नई कक्षाएं बनाते समय 'ओवरकिल' तक पहुंचने वाला कुछ भी नहीं है। खैर, आमतौर पर नहीं होता है, और इस मामले में नहीं है। –

उत्तर

29

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

+0

मैं इस मार्ग पर घायल हो गया क्योंकि दूसरों ने उतना ही जटिल देखा और यह .NET 3.5 में है इसलिए मेरे लिए कोई टुपल्स –

+0

बुद्धिमान निर्णय :) –

2

क्या यह काम आपके लिए नहीं है?

Dictionary<string, List<string>> 

या आप एक Tuple इस्तेमाल कर सकते हैं और इस बात का एक शब्दकोश है:

Dictionary<string, Tuple<string, bool>> 
+0

तो वह इस के साथ बूलियन कैसे स्टोर करता है? –

+0

या समकक्ष, 'System.Collections.Specialized.NameValueCollection'। –

+1

राल्फ: मैंने शुरुआत में शीर्षक का उत्तर दिया। उस मामले के लिए एक समाधान जोड़ा गया। –

3

मैं नहीं मानता .net मल्टी मानचित्र जो अंतर्निहित होता है आम तौर पर एक डेटा संरचना का उपयोग कर सकते है इस प्रकार के भंडारण करने के लिए। दूसरी तरफ, मुझे नहीं लगता कि यह एक कस्टम ऑब्जेक्ट का उपयोग कर ओवरकिल है जो स्ट्रिंग और बूलियन दोनों रखता है।

+0

मल्टी-मैप्स आपको किसी दिए गए कुंजी के विरुद्ध कई मानों को स्टोर करने देता है, लेकिन मान एक ही प्रकार के होते हैं और अन्यथा प्रतिष्ठित नहीं होते हैं, इसलिए यह आवश्यक नहीं होगा। –

15

Multivalue शब्दकोश पोस्ट आपकी आवश्यकताओं को पूरा कर सकता है।

+8

मेरे ऐप में जॉन स्कीट कोड रखने के लायक हो सकता है :) –

+0

जॉन स्कीट का उदाहरण पूरी तरह से इस ज़रूरत को पूरा करेगा और यह सामान्य है! –

7

मुझे लगता है कि आम तौर पर आप टुपल्स की अवधारणा में शामिल हो रहे हैं - Tuple<x, y, z>, या Tuple<string, bool, value> जैसे कुछ।

सी # 4.0 में टुपल्स के लिए गतिशील समर्थन होगा, लेकिन इसके अलावा, आपको अपनी खुद की रोलिंग या ट्यूपल लाइब्रेरी डाउनलोड करने की आवश्यकता है।

You can see my answer here जहां मैंने एक सामान्य ट्यूपल क्लास के लिए कुछ नमूना कोड डाला। या मैं इसे यहां दोबारा पोस्ट कर सकता हूं:

public class Tuple<T, T2, T3> 
{ 
    public Tuple(T first, T2 second, T3 third) 

    { 
     First = first; 
     Second = second; 
     Third = third; 
    } 

    public T First { get; set; } 
    public T2 Second { get; set; } 
    public T3 Third { get; set; } 

} 
4

.NET4 में, आप (अनियंत्रित) इस्तेमाल कर सकते हैं: Dictionary<string, Tuple<bool,string>>

0

ए डिक्शनरी सिर्फ वस्तुओं की एक बंद संग्रह है। इस प्रकार, यह आपके इच्छित किसी भी प्रकार की वस्तु को पकड़ लेगा। ऑब्जेक्ट्स का सबसे सरल, जैसे, कहें, सर (जो ऑब्जेक्ट से प्राप्त होता है), लेकिन आपकी तरफ से बहुत कम कोड की आवश्यकता है।

एक संपूर्ण कक्षा लिखने की बजाय, एक गतिशील आवंटित सरणी, या मूल्य में एक सूची और उसके साथ चलने की बजाय।

शब्दकोश इस तरह से अत्यधिक लचीला हैं।

0

Lookup कक्षा के बारे में क्या?

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

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

11
class MappedValue 
{ 
    public string SomeString { get; set; } 
    public bool SomeBool { get; set; } 
} 

Dictionary<string, MappedValue> myList = new Dictionary<string, MappedValue>; 
0

एक और विचार बूलियन को एक अलग डेटा संरचना में संग्रहीत करना है, उदाहरण के लिए एक हैशसेट।

1

ट्यूपल हमेशा एक अच्छा समाधान है। इसके अलावा एक वस्तु उन्मुख दृष्टिकोण में, हमेशा विरासत पर संरचना का पक्ष लेते हैं। समूह बनाने वाले एक समग्र वस्तु का निर्माण करें। सीधे शब्दों में। मुझे लगता है कि आप साथी स्टैक ओवरफ्लोर्स से यहां कुछ अच्छे और साफ समाधानों से ढके हुए हैं। :)

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