2010-06-17 4 views
7

Le code suivant me donne une erreur:Dictionnaire générique - Obtention de l'erreur de conversion

 // GetDirectoryList() returns Dictionary<string, DirectoryInfo> 
     Dictionary<string, DirectoryInfo> myDirectoryList = GetDirectoryList(); 

     // The following line gives a compile error 
     foreach (Dictionary<string, DirectoryInfo> eachItem in myDirectoryList) 

L'erreur donne est la suivante:

Cannot convert type 'System.Collections.Generic.KeyValuePair<string,System.IO.DirectoryInfo>' to 'System.Collections.Generic.Dictionary<string,System.IO.DirectoryInfo>’ 

Ma question est: pourquoi est-il tente d'effectuer cette conversion? Est-ce que je ne peux pas utiliser une boucle foreach sur ce type d'objet?

Répondre

16

Il devrait être:

foreach (KeyValuePair<string, DirectoryInfo> eachItem in myDirectoryList) 

Le dictionnaire ne contient pas d'autres dictionnaires, il contient des paires de clés et des valeurs.

4

Les éléments stockés ne sont pas un dictionnaire, mais un KeyValuePair:

// GetDirectoryList() returns Dictionary<string, DirectoryInfo> 
    Dictionary<string, DirectoryInfo> myDirectoryList = GetDirectoryList(); 

    // The following line gives a compile error 
    foreach (KeyValuePair<string, DirectoryInfo> eachItem in myDirectoryList) 
4

vous devez utiliser:

Dictionary<string, DirectoryInfo> myDirectoryList = GetDirectoryList(); 
foreach (KeyValuePair<string, DirectoryInfo> itemPair in myDirectoryList) { 
    //do something 
} 
6

Dictionary<string, DirectoryInfo>

Met en œuvre

IEnumerable<KeyValuePair<string, DirectoryInfo>>

Ce qui signifie que la boucle foreach est en boucle sur KeyValuePair<string, DirectoryInfo> objets:

foreach(KeyValuePair<string, DirectoryInfo> kvp in myDirectoryList) 
{ 
} 

Il est aussi la raison pour laquelle l'une des méthodes d'extension IEnumerable vont toujours travailler avec un objet KeyValuePair ainsi:

// Get all key/value pairs where the key starts with C:\ 
myDirectoryList.Where(kvp => kvp.Key.StartsWith("C:\\")); 
1

Par foreach vous itérez chaque élément du dictionnaire, puis vous devez définir le type de données dont la prise dictonaire est

KeyValuePair<string, DirectoryInfo> 

plutôt que le type de dictonary. façon correcte donc:

foreach (KeyValuePair<string, DirectoryInfo> eachItem in myDirectoryList) 

Dictionnaire est un type générique, donc pas besoin de la boxe et unboxing.

4

Je pense que beaucoup de personnes ci-dessus ont répondu à la question de savoir pourquoi vous obtenez l'erreur, c'est-à-dire que le dictionnaire stocke KeyValuePairs et ne stocke pas les dictionnaires. Afin d'arrêter les petites erreurs comme celle que vous avez, je suggère d'utiliser une nouvelle syntaxe dans votre développement.

foreach (var eachItem in myDirectoryList) 

Le type de var sera déduit de myDirectoryList et vous ne fonctionnera pas dans le même problème. Aussi, si vous décidez de changer le type de myDirectoryList et que les propriétés de ses éléments enfants sont les mêmes, votre code sera toujours compilé.

Questions connexes