2010-02-09 15 views

उत्तर

10

ऐसा करने के लिए प्रत्यक्ष अंतर्निहित तरीका नहीं है। ऐसा इसलिए है क्योंकि OrderedDictionary के लिए सूचकांक कुंजी है; यदि आप वास्तविक कुंजी चाहते हैं तो आपको इसे स्वयं ट्रैक करना होगा। शायद सबसे सरल तरीके से एक इंडेक्स करने योग्य संग्रह के लिए कुंजी कॉपी करने के लिए है:

// dict is OrderedDictionary 
object[] keys = new object[dict.Keys.Count]; 
dict.Keys.CopyTo(keys, 0); 
for(int i = 0; i < dict.Keys.Count; i++) { 
    Console.WriteLine(
     "Index = {0}, Key = {1}, Value = {2}", 
     i, 
     keys[i], 
     dict[i] 
    ); 
} 

आप एक नया वर्ग है कि OrderedDictionary के लिए उपयोग लपेटता में इस व्यवहार को संपुटित सकता है।

+1

मैं भी ऐसा ही किया, लेकिन एक बार देखें: OrderedDictionary सूची = OrderItems; ऑब्जेक्ट strKey = सूची [e.OldIndex]; शब्दकोश एंटर्री dicEntry = new DictionaryEntry(); foreach (शब्दकोश में एंटर्री डेई) { अगर (DE.Value == strKey) { dicEntry.Key = DE.Key; dicEntry.Value = DE.Value; } } –

+0

@RedSwan: सूचकांक कहां है? – testing

+2

सूचकांक निश्चित रूप से * नहीं * कुंजी है - वे '' OrderedDictionary'' में आवश्यक रूप से अलग-अलग संरचनाएं हैं। – Conrad

35
orderedDictionary.Cast<DictionaryEntry>().ElementAt(index); 
+1

के उत्तर में दिखाया गया है, आप सर का उपयोग करते हुए – Seb

+1

सिस्टम का उपयोग कर 'लिनक;' – testing

+0

इस कोड के साथ आपको तत्व मिलता है। लेकिन मैं SO सवाल में कुंजी और मूल्य कैसे प्राप्त करूं? – testing

1

मैंने कुछ विस्तार विधियां बनाई हैं जो पहले बताए गए कोड का उपयोग करके इंडेक्स और कुंजी द्वारा कुंजी प्राप्त करती हैं।

public static T GetKey<T>(this OrderedDictionary dictionary, int index) 
{ 
    if (dictionary == null) 
    { 
     return default(T); 
    } 

    try 
    { 
     return (T)dictionary.Cast<DictionaryEntry>().ElementAt(index).Key; 
    } 
    catch (Exception) 
    { 
     return default(T); 
    } 
} 

public static U GetValue<T, U>(this OrderedDictionary dictionary, T key) 
{ 
    if (dictionary == null) 
    { 
     return default(U); 
    } 

    try 
    { 
     return (U)dictionary.Cast<DictionaryEntry>().AsQueryable().Single(kvp => ((T)kvp.Key).Equals(key)).Value; 
    } 
    catch (Exception) 
    { 
     return default(U); 
    } 
} 
+0

यदि आपका इरादा डिफ़ॉल्ट मान वापस करना है यदि लक्षित अनुक्रमणिका/कुंजी शब्दकोश में नहीं है तो आपने एक महंगा तरीका चुना है कर दो। सामान्य नियंत्रण-प्रवाह संरचनाओं के संबंध में अपवाद बहुत महंगे होते हैं जैसे कि/else। एक अपवाद पर भरोसा करने के बजाय आउट-ऑफ-बाउंड इंडेक्स और गैर-मौजूदा कुंजी की जांच करना बेहतर होगा। – Odrade

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