2009-06-04 7 views
5

का उपयोग कर IDictionary की सामग्री को कैसे बदलूं I ​​C# 3.0 (लिंक, लिंक एक्सटेंशन) का उपयोग करके IDictionary की सामग्री को कैसे बदलूं?मैं LINQ (सी # 3.0)

var enumerable = new int [] { 1, 2}; 
var dictionary = enumerable.ToDictionary(a=>a,a=>0); 
//some code 
//now I want to change all values to 1 without recreating the dictionary 
//how it is done? 

उत्तर

4

यह अन्य तरीकों के रूप में लगभग के रूप में स्पष्ट नहीं है, लेकिन यह ठीक से काम करना चाहिए:

public static class MyExtensions 
{ 
    public static void ForEach<T>(this IEnumerable<T> items, Action<T> action) 
    { 
     foreach (var item in items) 
     { 
      action(item); 
     } 
    } 
} 

:

dictionary.Keys.ToList().ForEach(i => dictionary[i] = 0); 

मेरे अन्य वैकल्पिक इस के समान एक foreach विस्तार विधि बनाने के लिए हो गया होता फिर इसे इस तरह उपयोग करें:

dictionary.ForEach(kvp => kvp.Value = 0); 

हालांकि इस मामले में यह काम नहीं करेगा, जैसा कि वैल्यू नहीं हो सकता पर हस्ताक्षर किए

+0

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

+1

स्पष्ट नहीं है * और * कम कुशल (चाबियों की एक क्लोन सूची बनाता है, और 1 के बजाय 2 पुनरावृत्तियों करता है) ... एक विजेता! –

4

LINQ एक प्रश्न बोली है - यह सीधे एक उत्परिवर्तन भाषा नहीं है।

foreach(int key in dictionary.Keys) { 
    dictionary[key] = 1; 
} 
+0

क्या यह अच्छा नहीं होगा अगर यह उत्परिवर्तन भाषा भी हो? –

+3

यह वही है ... –

+1

यह गणना के दौरान संग्रह के बारे में एक रनटाइम त्रुटि देता है, और फ़ोरैच लूप जारी नहीं रह सकता है। – pauldoo

2
foreach (var item in dictionary.Keys) 
    dictionary[item] = 1; 

मुझे आश्चर्य है कि तुम क्यों एक की जरूरत, ऐसी बात कर सकता है, हालांकि:

एक मौजूदा शब्दकोश के मूल्यों को बदलने के लिए, foreach शायद अपने दोस्त है।

+0

यह एक oversimplification था। –