2013-03-06 10 views
19

के माध्यम से पुनरावृत्त करने के लिए उपयोग करते हुए मैं आम तौर पर शब्दकोश के माध्यम से फिर से शुरू करने के लिए एक foreach पाश का उपयोग करता हूं।एक लूप के लिए एक शब्दकोश

Dictionary<string, string> dictSummary = new Dictionary<string, string>(); 

इस मामले में मैं सफेद स्थान की प्रविष्टियों को ट्रिम करना चाहता हूं और फ़ोरैच लूप हालांकि इसके लिए अनुमति नहीं देता है।

foreach (var kvp in dictSummary) 
{ 
    kvp.Value = kvp.Value.Trim();  
} 

मैं इसे लूप के साथ कैसे कर सकता हूं?

for (int i = dictSummary.Count - 1; i >= 0; i--) 
{ 
} 
+0

संभव डुप्लिकेट: [? क्या सबसे अच्छा तरीका है सी # में एक शब्दकोश से अधिक पुनरावृति करने के लिए है] (http://stackoverflow.com/questions/141088/what यह कुंजी के साथ शब्दकोश तक पहुँचने के रूप में सरल है -इस-द-बेस्ट-वे-टू-इटेटेट-ओवर-ए-डिक्शनरी-इन-सी) – publicgk

+3

या यह;) http://stackoverflow.com/questions/1070766/editing-dictionary-values-in-a- foreach-loop – Belial09

+1

@ Belial09 आपके द्वारा पोस्ट किए गए लिंक में पूछे गए प्रश्न में, ऐसा लगता है कि कुंजी संशोधित नहीं हैं; सिर्फ मूल्य। – joce

उत्तर

14

KeyValuePair<TKey, TValue> आप Value निर्धारित करने की अनुमति नहीं है, यह अपरिवर्तनीय है।

आप इस तरह यह करना होगा:

foreach(var kvp in dictSummary.ToArray()) 
    dictSummary[kvp.Key] = kvp.Value.Trim(); 

यहाँ महत्वपूर्ण हिस्सा ToArray है। यह शब्दकोश को सरणी में कॉपी करेगा, इसलिए फोरैच के अंदर शब्दकोश को बदलना InvalidOperationException नहीं फेंक देगा।

dictSummary = dictSummary.ToDictionary(x => x.Key, x => x.Value.Trim()); 
32
इस बारे में

क्या:

एक वैकल्पिक दृष्टिकोण LINQ के ToDictionary विधि का प्रयोग करेंगे?

for (int i = dictSummary.Count - 1; i >= 0; i--) { 
    var item = dictSummary.ElementAt(i); 
    var itemKey = item.Key; 
    var itemValue = item.Value; 
} 
+5

हालांकि इस तरह के कोड का उपयोग करना संभव है, मैं इसकी अनुशंसा नहीं करता। 'संख्यात्मक। एलिमेंट एटी' शब्दकोश में तत्वों तक पहुंचने का वास्तव में सबसे अच्छा तरीका नहीं है ... आपका कोड संभवतः ओ (एन^2) है क्योंकि शब्दकोश स्थिति के आधार पर तत्वों तक पहुंच की अनुमति नहीं देता है। –

+1

आप अंत से शुरुआत तक क्यों चल रहे हैं? मुझे मत बताओ, यह प्रदर्शन कारणों से है ... – DHN

+0

@AlexeiLevenkov ... धन्यवाद। मुझे इसके बारे में पता नहीं था। बस इस मुद्दे की खोज की और यह एक बड़ी कमी की तरह दिखता है। एक बार फिर धन्यवाद। –

3

आप .ToArray() या .ElementAt() उपयोग करने की आवश्यकता नहीं है।

dictSummary.Keys.ToList().ForEach(k => dictSummary[k] = dictSummary[k].Trim()); 
संबंधित मुद्दे