2011-05-17 15 views
5

Por favor, considere el siguiente código:Diccionario <StudentType, List <Student>> to IDictionary <StudentType, IList <Student>>?

class Student 
{ 
} 

enum StudentType 
{ 
} 

static void foo(IDictionary<StudentType, IList<Student>> students) 
{ 
} 

static void Main(string[] args) 
{ 
    Dictionary<StudentType, List<Student>> studentDict = 
        new Dictionary<StudentType, List<Student>>(); 

    foo(studentDict); 

    ... 
} 

Existe el error:

error CS1503: Argument '1': cannot convert from 'System.Collections.Generic.Dictionary>' to 'System.Collections.Generic.IDictionary>'

¿Hay alguna manera de llamar a la función foo?

+0

a implementar sus propias colecciones? Si no, no puede ver ninguna razón para evitar tener 'static void foo (Dictionary > students)' que también resolverá este problema. –

+0

'static void foo (IDictionary > estudiantes) ' es solo por simplicidad. En lugar de 'foo()' IDictionary <> se pasa a otra parte de mi aplicación, por lo que es necesario utilizar 'IDictionary <>' y 'IList <>' para proporcionar una abstracción. –

Respuesta

6

Se puede usar el método de LINQ ToDictionary para crear un nuevo diccionario en el que el valor tiene el tipo correcto:

static void Main(string[] args) 
{ 
    Dictionary<StudentType, List<Student>> studentDict = new Dictionary<StudentType, List<Student>>(); 
    var dicTwo = studentDict.ToDictionary(item => item.Key, item => (IList<Student>)item.Value); 
    foo(dicTwo); 
} 
+0

¡Gracias! Eso es exactamente lo que necesito. –

3

Tendrás que compilar un nuevo diccionario con los tipos correctos, copiando los datos del anterior en el nuevo.

O bien, puede cambiar el diccionario original para que sea del tipo correcto para comenzar.

De cualquier manera, no, no se puede convertir el diccionario.

La razón de esta limitación es la siguiente:

  1. El diccionario contiene valores de tipo Student
  2. usted podría tener muchos tipos que implementan iStudent
  3. El método que está dando la cast'ed diccionario para potencialmente podría intentar rellenar otro IStudent en el diccionario, incluso si no es Estudiante
+0

No entiendo esta respuesta. No hay IStudent en la pregunta. – richb

0

cambie la creación de studentDict to be:

Dictionary<StudentType, IList<Student>> studentDict = new Dictionary<StudentType, IList<Student>>(); 
+0

Lo sentimos, pero no es una opción. Necesito exactamente esta creación. –

+0

¿Puedes explicar por qué necesitas exactamente esa creación? puede agregar una lista a esa creación. Si ya ha creado el objeto en otro lugar de su código, deberá convertirlo creando un nuevo diccionario y emitiendo los valores – IndigoDelta

+0

Porque necesito llamar a las funciones de miembro específicas de la Lista cuando las obtengo del diccionario. –

Cuestiones relacionadas