2010-06-17 8 views
7

El siguiente código es que me da un error:diccionario genérico - Obtención de un error de conversión

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

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

El error que da es la siguiente:

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

Mi pregunta es: ¿por qué está intentando realizar esta conversión? ¿No puedo usar un bucle foreach en este tipo de objeto?

Respuesta

16

que debe ser:

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

El diccionario no contiene otros diccionarios, contiene pares de claves y valores.

4

Los artículos almacenados no es un diccionario, sino 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

es necesario utilizar:

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

Dictionary<string, DirectoryInfo>

Implementa

IEnumerable<KeyValuePair<string, DirectoryInfo>>

Lo que significa que el bucle foreach es un bucle más KeyValuePair<string, DirectoryInfo> objetos:

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

Es también la razón por cualquiera de los métodos de extensión IEnumerable siempre trabajar con un objeto KeyValuePair así:

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

Por foreach se itere cada elemento del diccionario, luego debe definir el tipo de datos de la retención del dictário que es

KeyValuePair<string, DirectoryInfo> 

en lugar del tipo de dictonary. manera Así correcta:

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

diccionario es un tipo genérico por lo que no hay necesidad de boxeo y unboxing.

4

Creo que muchas de las personas anteriores han respondido la pregunta de por qué está obteniendo el error, es decir, el diccionario almacena KeyValuePairs y no almacena Dictionarys. Para detener pequeños errores como el que está teniendo, sugeriría usar una nueva sintaxis en su desarrollo.

foreach (var eachItem in myDirectoryList) 

El tipo de var se infiere de myDirectoryList y no se encontrará con el mismo problema. Además, si decide cambiar el tipo de myDirectoryList y las propiedades en sus elementos secundarios son iguales, su código aún se compilará.

Cuestiones relacionadas