2009-07-09 10 views
3

je me rends compte que vous ne pouvez pas itérer sur un dictionnaire en C# et de modifier le sous-jacent Dictionary comme dans l'exemple suivant:bouclez Dictionnaire en C#

Dictionary<Resource, double> totalCost = new Dictionary<Resource, double>(); 
// Populate the Dictionary in here - (not showing code).  
foreach (Resource resource in totalCost.Keys) 
{ 
    totalCost[resource] = 5; 
} 

Une façon que je vois de résoudre ce problème est de faire une liste soutenue par les clés de dictionnaire, comme celui-ci:

Dictionary<Resource, double> totalCost = new Dictionary<Resource, double>(); 
// Populate the Dictionary in here - (not showing code).  
foreach (Resource resource in new List(totalCost.Keys)) 
{ 
    totalCost[resource] = 5; 
} 

Parce que je ne suis pas modifier les clés elles-mêmes, est-il une raison que cela ne devrait pas être fait ou qu'il est mauvais de choisir cela comme une solution. (Je réalise que si je modifiais ces touches, cela pourrait causer beaucoup de problèmes.)

Merci.

Modifier: J'ai corrigé mon exemple de code. Désolé pour ça.

+2

Le premier morceau de code ne fonctionne-t-il pas? –

+0

Vous avez raison. Désolé à ce sujet - l'a corrigé pour montrer le problème que j'essayais de décrire. – JasCav

Répondre

7

Dans vos exemples, il ne me semble pas que vous modifiez les valeurs du dictionnaire (ou les clés)?

En général votre solution semble bien, vous pouvez le faire avec un peu moins de code comme ceci:

List<double> total = new List<double>(); 
foreach (AKeyObject key in aDictionary.Keys.ToList()) 
{ 
    for (int i = 0; i < aDictionary[key].Count; i++) 
    { 
     total[i] += aDictionary[key][i]; 
    } 
} 
+0

Malheureusement, je n'ai pas accès à "ToList()" - toujours en utilisant Visual Studio 2005 (je suppose que c'est la raison). Mais, merci pour cette suggestion. – JasCav

+0

Votre solution semble bien. –

+1

Le ToList() est complètement inutile de toute façon, "dans aDictionary.Keys" fonctionnera très bien. – Thorarin

1

Votre premier morceau de code me va bien - vous n'éditez pas du tout le dictionnaire.

9

Vous pouvez passer en boucle dictionnaires avec l'aide KeyValuePair classe.

Dictionary<string, string> d1 = new Dictionary<string, string>(); 
foreach (KeyValuePair<string, string> val in d1) 
{ 
    ... 
} 
0

Voici une autre version plus LINQ-esque:

totalCost = totalCost 
    .ToDictionary(kvp => kvp.Key, 5); 

Ou, si 5 est pas tout à fait ce que vous voulez :)

totalCost = totalCost 
    .ToDictionary(kvp => kvp.Key, CalculateSomething(kvp.Value)); 

(Note: cela ne modifie pas le dictionnaire sous-jacent, à la place il le remplace par un nouveau)