listas lista cast c# linq generics listview

cast - lista de listas c#



¿Cómo puedo convertir IEnumerable<T> a List<T> en C#? (5)

Estoy usando LINQ para consultar un diccionario genérico y luego uso el resultado como fuente de datos para mi ListView (WebForms).

Código simplificado:

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

Pensé que funcionaría, pero de hecho arroja una System.InvalidOperationException :

ListView con id ''myListView'' debe tener una fuente de datos que implemente ICollection o que pueda realizar la búsqueda de fuente de datos si AllowPaging es verdadero.

Para 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 error en el primer ejemplo para que funcione?

(No estaba seguro de qué usar como título de pregunta para este, no dude en editar algo más apropiado)


Prueba esto:

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

Tenga en cuenta que, básicamente, se creará una nueva lista de la colección de valores original, por lo que cualquier cambio en su diccionario no se reflejará automáticamente en su control vinculado.


Solo 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")


También puedes probar:

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

Básicamente, las colecciones genéricas son muy difíciles de lanzar directamente, por lo que realmente no tiene más remedio que crear un nuevo objeto.


Tiendo a preferir usar la nueva sintaxis de Linq:

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

¿Por qué recibes un diccionario cuando no usas la clave? Estás pagando por eso.


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