2010-02-11 9 views
9

He estado usando LINQ por un tiempo (y lo disfruto), pero parece que toco un acelerador rápido cuando me encuentro con colecciones especializadas de .NET (DataRowCollection, ControlCollection). ¿Hay alguna manera de utilizar LINQ con estos controles especializados, y si no crees que Microsoft abordará esto en la próxima versión del framework? ¿O tenemos que iterar sobre estas formas que no son LINQ, o retirar los elementos de la colección en colecciones propias de LINQ?¿Alguna vez Microsoft hará todas las colecciones utilizables por LINQ?

Respuesta

21

La razón por la cual las colecciones como ControlCollection no funcionan con LINQ es que no están fuertemente tipadas. Sin un tipo de elemento LINQ no puede crear métodos fuertemente tipados. Siempre que conozca el tipo, puede usar el método Cast para crear una enumeración fuertemente tipada y, por lo tanto, usarla con LINQ. Por ejemplo

ControlCollection col = ... 
var query = col.Cast<Control>().Where(x => ...); 

Como el querer Microsoft siempre hacen estos implementan IEnumerable<T> por defecto. Mi conjetura es no aquí. La razón de por qué es que hacerlo es un cambio radical y puede causar un comportamiento esperado en el código. Incluso la simple implementación de IEnumerable<Control> para ControlCollection provocaría cambios en la resolución de sobrecarga que pueden, y casi seguramente romperán, las aplicaciones del usuario.

+0

Esa es la respuesta. Olvidé el elenco. Microsoft aún podría agregar colecciones de tipos fuertes para ControlCollection y tal. Gracias y gracias a todos los que contribuyeron. –

+0

¿Por qué Microsoft no creó el ControlCollection como una colección fuertemente tipada (de tipo Control)? – BornToCode

1

La razón de esto es: Colecciones que no aplican IEnumerable<T> o IQueryable, no se pueden repetir en LINQ

+0

tiene que ser IEnumerable

+1

Bueno, todas las colecciones implementan IEnumerable (de lo contrario, no podría recorrerlas). Pero para poder ser utilizado por linq, deberán implementar la versión genérica (IEnumerable ). –

+0

Mencioné la versión genérica de IEnumerable, pero SOF (Editor de texto) no me dejará hacerlo. No lo noté temprano, hice la corrección. Gracias de cualquier manera –

4

Usted debe ser capaz de hacer algo como esto:

myDataRowCollection.Cast<DataRow>().Where..... 

y utilizar LINQ que camino. Si sabes cuáles son los objetos en la colección, entonces deberías poder usar eso.

Cuestiones relacionadas