2010-03-29 13 views
12

के लिए वैल्यू कोलेक्शन मैं कक्षा में Dictionary<int, MyType> का उपयोग कर रहा हूं। वह वर्ग एक इंटरफ़ेस लागू करता है जिसके लिए IList<MyType> लौटाया जाना आवश्यक है। क्या एक को दूसरे को कास्ट करने का कोई आसान तरीका है (पूरी चीज की प्रतिलिपि किए बिना)?कन्वर्ट डिक्शनरी <MyType>। इलिस्ट <MyType>

मेरे वर्तमान समाधान इस प्रकार है:

private IList<MyType> ConvertToList(Dictionary<int, MyType>.ValueCollection valueCollection) 
{ 
    List<MyType> list = new List<MyType>(); 
    list.AddRange(valueCollection); 
    return list; 
} 
+0

अब तक बनाए गए हर समाधान में पूरे संग्रह की प्रतिलिपि शामिल है। ** प्रश्न पढ़ें **। – SLaks

+0

@Slaks: मैंने इसे सीधे मेरे जवाब में संबोधित किया ... (जिसमें अभी भी प्रतिलिपि शामिल है, हालांकि) –

+0

क्या कुंजी टाइप "int" के लिए कोई प्रासंगिकता है, या यह एक मनमाना प्रकार है? –

उत्तर

20

आपको एक प्रतिलिपि करने की आवश्यकता होगी, लेकिन यह शायद एक अच्छी बात है। सी # 2 में, आपका वर्तमान कोड लगभग सबसे साफ है जिसे आप बना सकते हैं। यह आपके मूल्यों को सीधे आपके मूल्यों (List<MyType> list = new List<MyType>(valueCollection);) से बनाकर सुधार किया जाएगा, लेकिन एक प्रतिलिपि अभी भी आवश्यक होगी।

साथ # 3 सी LINQ का उपयोग करते हुए, हालांकि, आप करने में सक्षम हो जाएगा:

myDictionary.Values.ToList(); 

कहा जा रहा है, मैं नहीं (शायद) की नकल से बचने के लिए कोशिश करेंगे। अपने मूल्यों की एक प्रति लौटाना सुरक्षित हो जाता है, क्योंकि यह कॉलर को आपके संग्रह को संशोधित करने का प्रयास करते समय समस्याएं उत्पन्न करने से रोकता है। एक प्रतिलिपि लौटकर, कॉलर list.Add(...) या list.Remove(...) कर सकता है, जिससे आपकी कक्षा की समस्याएं उत्पन्न हो सकती हैं।


संपादित करें: नीचे अपनी टिप्पणी को देखते हुए अगर सभी आप चाहते है एक IEnumerable<T> एक गणना के साथ, आप बस लौट सकते हैं ICollection<T>। यह सीधे ValueCollection द्वारा कार्यान्वित किया जाता है, जिसका अर्थ आप बस सीधे अपने शब्दकोश के मूल्यों लौट सकते हैं, कोई नकल के साथ:

private ICollection<MyType> ConvertToList(Dictionary<int, MyType>.ValueCollection valueCollection) 
{ 
    return valueCollection; 
} 

(दी, इस पद्धति वास्तव में इस मामले में बेकार हो जाता है - लेकिन मैं के लिए यह प्रदर्शित करने के लिए करना चाहता था आप ...)

+0

@ स्लक्स: इसलिए अगली वाक्य: "आप सीधे अपने मूल्यों से अपनी सूची बना सकते हैं,";) यह बेहतर नहीं है, हालांकि यह एक आईसीओलेक्शन है, यह अधिक कुशल होगा (क्योंकि गणना अग्रिम में जानी जाती है)। –

+0

@ स्लक्स: यह बेहतर है? मैंने इसे और अधिक स्पष्ट बना दिया। –

+0

उत्कृष्ट उत्तर के लिए धन्यवाद। आईसीओलेक्शन इंटरफेस पूरी तरह से मेरी जरूरतों को पूरा करता है। –

0

आप निर्माता का उपयोग कर सकते हैं: (। एक अभिकथन मुझे यकीन है कि नहीं कर रहा हूँ पर 100% दूर करने के लिए संपादित)

public IList<MyType> MyValues 
{ 
    get { return new List<MyType>(myDictionary.Values); } 
} 

+0

यह अभी भी संग्रह की एक प्रति बनाता है। – mcNux

4

कैसे लगभग

Dictionary<int, MyType> dlist = new Dictionary<int, MyType>(); 
IList<MyType> list = new List<MyType>(dlist.Values); 
+2

यह अभी भी संग्रह की प्रतिलिपि बनाता है। – SLaks

2

यह संभव नहीं है।

एक शब्दकोश (इसके Values संग्रह सहित) एक स्वाभाविक रूप से अनियंत्रित संग्रह है; इसका क्रम उसकी चाबियों के हैशकोड के आधार पर बदल जाएगा। यही कारण है कि ValueCollection पहले स्थान पर IList<T> लागू नहीं करता है।

तुम सच में करना चाहता था हैं, तो आप एक आवरण वर्ग कि IList लागू करता है और ValueCollection लपेटता, इंडेक्सर में एक foreach पाश का उपयोग कर बना सकते हैं। हालांकि, यह एक अच्छा विचार नहीं है।

+0

@SLaks मैं आदेश के बारे में picky नहीं हूँ। मैं जो चाहता हूं वह गिनती के साथ IENumerable है। यदि एक बेहतर इंटरफ़ेस है, तो मुझे बताएं। –

+0

@ सी। रॉस: मेरा संपादन देखें, फिर ... –

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