मुझे एक शब्दकोश में कुंजियों की सूची कैसे मिलेगी?


152

मैं केवल कुंजी चाहता हूं और एक शब्दकोश का मान नहीं।

मैं अभी तक ऐसा करने के लिए कोई भी कोड प्राप्त नहीं कर पाया हूं। एक और सरणी का उपयोग करना बहुत अधिक काम का साबित हुआ क्योंकि मैं हटाने का भी उपयोग करता हूं।

मुझे एक शब्दकोश में कुंजी की सूची कैसे मिलती है?

जवाबों:


305
List<string> keyList = new List<string>(this.yourDictionary.Keys);

6
क्या इसका उपयोग करना "आवश्यक है।"
जेरीगोपाल

15
@ जेरी गोयल नहीं, यह आवश्यक नहीं है। इसका उपयोग केवल इस बात yourDictionaryको लेकर भ्रम को दूर करने के लिए किया जाता है कि क्या वस्तु का हिस्सा है, फ़ंक्शन में व्युत्पन्न है या एक पैरामीटर नाम है।
12

1
एक और पूर्ण उत्तर कुंजी प्रकार को एक स्ट्रिंग होने के रूप में ग्रहण नहीं करना होगा। var keyList = yourDictionary.Keys.ToList (); या अगर आप नट्स जाना चाहते हैं और var या Linq का उपयोग नहीं करना चाहते हैं: - keyType = yourDictionary.GetType ()। GetGenericArguments () [0] टाइप करें; प्रकार सूची टाइप करें = टाइप करें (सूची <>)। मेकगेनरिक टाइप (की-टाइप); IList keyList = (IList) Activator.CreateInstance (listType); keyList.AddRange (yourDictionary.Keys);
एंटनी बूथ

70

आपको सिर्फ देखने में सक्षम होना चाहिए .Keys:

    Dictionary<string, int> data = new Dictionary<string, int>();
    data.Add("abc", 123);
    data.Add("def", 456);
    foreach (string key in data.Keys)
    {
        Console.WriteLine(key);
    }

2
और क्या होगा अगर आप लूप में चाबियाँ निकाल रहे हैं?
मार्टिन कैपोडिसी

5
@MartinCapodici तो आप आमतौर पर इटरेटर तोड़ने के लिए और जारी रखने के लिए मना करने की उम्मीद करनी चाहिए
मार्क Gravell

5
मार्क, हां तो उस स्थिति में आप अन्य उत्तर की तरह कुछ करेंगे और एक नई सूची बनाएंगे।
मार्टिन कैपोडिसी

43

सभी चाबियों की सूची प्राप्त करने के लिए

using System.Linq;
List<String> myKeys = myDict.Keys.ToList();

System.Linq .Net फ्रेमवर्क 3.5 या इसके बाद के संस्करण में समर्थित है। यदि आप System.Linq का उपयोग करने में किसी समस्या का सामना करते हैं तो नीचे दिए गए लिंक देखें

विजुअल स्टूडियो System.Linq को नहीं पहचानता है

सिस्टम.लिंक नेमस्पेस


13
कृपया मत भूलना: using System.Linq;मुझे यह जानने की जरूरत है कि कौन से उत्तर को अनदेखा करना है। क्षमा करें :)
Bitterblue

2
साभार @Bitterblue मुझे समझ में नहीं आ .ToList()रहा था कि जब मैंने इसे कई बार इस्तेमाल किया था, तो मैं एक त्रुटि क्यों फेंक रहा था, इसलिए मैं यहां एक उत्तर की तलाश में आया था और मुझे एहसास हुआ कि जिस फ़ाइल में मैं काम कर रहा था वह नहीं थी using System.Linq:)
आकर्षित

1
काम नहीं करता है:Dictionary<string, object>.KeyCollection' does not contain a definition for 'ToList'
शक

वास्तव में काम नहीं करता है। इसके बजाय स्वीकृत उत्तर का उपयोग करें।
एलेक

1
@aleck यह बहुत अच्छा काम करता है। आपने सिस्टम का उपयोग नहीं किया होगा। Bqblue या .Net फ्रेमवर्क संस्करण द्वारा सुझाए गए अनुसार आप इसका समर्थन नहीं करते हैं। इसे .Net फ्रेमवर्क 3.5 में पेश किया गया था, इस लिंक को देखें । मैं इस पद्धति का उपयोग करने से पहले System.Linq का उपयोग करने के उत्तर को अपडेट कर रहा हूं।
प्रेम

12

मार्क ग्रेवेल का जवाब आपके लिए काम करना चाहिए। myDictionary.Keysएक वस्तु देता है जो लागू करता है ICollection<TKey>, IEnumerable<TKey>और उनके गैर-सामान्य समकक्ष।

मैं बस यह जोड़ना चाहता था कि यदि आप मूल्य के साथ-साथ पहुँच की योजना बनाते हैं, तो आप इस तरह से शब्दकोश के माध्यम से लूप कर सकते हैं (संशोधित उदाहरण):

Dictionary<string, int> data = new Dictionary<string, int>();
data.Add("abc", 123);
data.Add("def", 456);

foreach (KeyValuePair<string, int> item in data)
{
    Console.WriteLine(item.Key + ": " + item.Value);
}

3

प्रश्न समझने में थोड़ा मुश्किल है, लेकिन मैं अनुमान लगा रहा हूं कि समस्या यह है कि आप कुंजी से पुनरावृति करते हुए शब्दकोश से तत्वों को निकालने का प्रयास कर रहे हैं। मुझे लगता है कि उस मामले में आपके पास दूसरी सरणी का उपयोग करने के अलावा कोई विकल्प नहीं है।

ArrayList lList = new ArrayList(lDict.Keys);
foreach (object lKey in lList)
{
  if (<your condition here>)
  {
    lDict.Remove(lKey);
  }
}

यदि आप एक ArrayList के बजाय सामान्य सूचियों और शब्दकोशों का उपयोग कर सकते हैं, तो मैं करूँगा, हालांकि ऊपर सिर्फ काम करना चाहिए।


2

मैं इन सभी उलझे हुए जवाबों पर विश्वास नहीं कर सकता। मान लें कि कुंजी प्रकार की है: यदि आप एक आलसी डेवलपर हैं तो स्ट्रिंग (या 'var' का उपयोग करें): -

List<string> listOfKeys = theCollection.Keys.ToList();

तुम्हारा क्या मतलब है यह काम नहीं करता है? डिक्शनरी में कुंजियों की एक संपत्ति होती है जो कि कीकोलेक्शन की होती है, जो कि ICollection को लागू करती है जिसमें एक ToList <> () एक्सटेंशन विधि होती है। अपने 'स्टेटमेंट्स' का उपयोग करके System.Linq को जोड़ें और आपको अच्छा होना चाहिए। using System.linq;
एंटनी बूथ

0

या इस तरह:

List< KeyValuePair< string, int > > theList =
    new List< KeyValuePair< string,int > >(this.yourDictionary);

for ( int i = 0; i < theList.Count; i++)
{ 
  // the key
  Console.WriteLine(theList[i].Key);
}

क्या यह कुंजियों की एक प्रति बनाता है? (ताकि आप सुरक्षित रूप से गणना कर सकें)
mcmillab

वह फिर से लिख रहा है।। इसके अलावा, KeyValuePair की एक सूची एक शब्दकोश है। मूल अनुरोध केवल कीज़ की सूची के लिए था। पॉप्युलेट करने के लिए लूप का उपयोग करना अनावश्यक है क्योंकि सूची में एक कंस्ट्रक्टर है जो एक संग्रह लेता है और इसमें मौजूदा सूची में जोड़ने के लिए एक AddRange () विधि भी है। स्वीकृत उत्तर देखें।
एंटनी बूथ

0

हाइब्रिड शब्दकोश के लिए, मैं इसका उपयोग करता हूं:

List<string> keys = new List<string>(dictionary.Count);
keys.AddRange(dictionary.Keys.Cast<string>());

-2

मैंने अक्सर एक शब्दकोश के अंदर कुंजी और मूल्य प्राप्त करने के लिए इसका उपयोग किया: (VB.Net)

 For Each kv As KeyValuePair(Of String, Integer) In layerList

 Next

(लेयरलिस्ट टाइप डिक्शनरी का है (स्ट्रिंग, इंटेगर का))

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.