2008-08-28 29 views
17

Estoy usando LINQ para consultar un diccionario genérico y luego uso el resultado como el origen de datos para mi ListView (WebForms).¿Cómo puedo convertir IEnumerable <T> en la lista <T> en C#?

código simplificado:

Dictionary<Guid, Record> dict = GetAllRecords(); 
myListView.DataSource = dict.Values.Where(rec => rec.Name == "foo"); 
myListView.DataBind(); 

pensé que iba a funcionar, pero en realidad se lanza una System.InvalidOperationException:

ListView con id 'MyListView' debe tener un origen de datos que implementa ICollection o puede realizar la búsqueda de fuente de datos si AllowPaging es true.

Con el fin de conseguir que funcione he tenido que recurrir a lo siguiente:

Dictionary<Guid, Record> dict = GetAllRecords(); 
List<Record> searchResults = new List<Record>(); 

var matches = dict.Values.Where(rec => rec.Name == "foo"); 
foreach (Record rec in matches) 
    searchResults.Add(rec); 

myListView.DataSource = searchResults; 
myListView.DataBind(); 

¿Hay un pequeño Gotcha en el primer ejemplo de hacer que funcione?

(no estaba segura de lo que va a utilizar como título de la pregunta para éste, se siente libre de editar a algo más apropiado)

+0

Este es el reverso de http://stackoverflow.com/questions/472669/c-freely-convert-between-listt-and-ienumerablet – John

Respuesta

29

Prueba esto:

var matches = dict.Values.Where(rec => rec.Name == "foo").ToList(); 

Tenga en cuenta que esto será esencialmente creando una nueva lista de la colección de Valores original, de modo que cualquier cambio en su diccionario no se reflejará automáticamente en su control vinculado.

1
myListView.DataSource = (List<Record>) dict.Values.Where(rec => rec.Name == "foo"); 
+0

[@lomaxx] (http://stackoverflow.com/ questions/31708/how-can-i-convert-ienumerablet-to-listt-in-C# 31712): Su primera solución no funciona. Parece que no puedo convertir el resultado de la cláusula where en una lista . Resulta en la siguiente excepción de tiempo de ejecución: * No se puede convertir el objeto de tipo ' d__0'1 [Record]' para escribir 'System.Collections.Generic.List'1 [Record]'. * Su segunda solución funciona muy bien y también lo hace [Matt Hamiltons] (http://stackoverflow.com/questions/31708/how-can-i-convert-ienumerablet-to-listt-in-c#31710). He aceptado [Matt Hamiltons] (http://stackoverflow.co –

3

También puede intentar:

var matches = new List<Record>(dict.Values.Where(rec => rec.Name == "foo")); 

colecciones Básicamente genéricos son muy difíciles de emitir directamente, por lo que realmente no tienen más remedio que crear un nuevo objeto.

9

tiendo a preferir el uso de la nueva sintaxis de LINQ:

myListView.DataSource = (
    from rec in GetAllRecords().Values 
    where rec.Name == "foo" 
    select rec).ToList(); 
myListView.DataBind(); 

¿Por qué es usted que consigue un diccionario cuando no se utiliza la tecla? Estás pagando por eso.

+0

Voto a favor para usted. – fuzz

+0

[@Keith] (http: // stackoverflow.com/questions/31708/how-can-i-convert-ienumerablet-to-listt-in-C# 32016): Estoy usando una clave Guid en el diccionario en otro lugar de mi código para poder obtener un registro registro de identificación Aceptar estar en desacuerdo sobre la sintaxis;) –

0

Simplemente agregando conocimiento, la siguiente oración no recupera ningún dato de de db. Solo crea la consulta (para eso es de tipo ilegible). Para iniciar esta consulta, debe agregar .ToList() o .First() al final.

dict.Values.Where(rec => rec.Name == "foo") 
Cuestiones relacionadas