2010-04-15 13 views
21

Me gustaría usar un DataGridViewRowCollection en una expresión LINQ usando métodos de extensión y expresiones lambda. Desafortunadamente, los métodos de extensión son para los tipos IEnumerable<T>, que DataGridViewRowCollection no implementa. Lo curioso es, puedo usar LINQ aquí con la sintaxis de tipo SQL:Usando el objeto DataGridViewRowCollection en LINQ

IEnumerable<DataGridViewRow> lRows = from DataGridViewRow row in dgvGrid.Rows 
            select row; 

Después de hacer eso, me pueden los uso de métodos de extensión LINQ:

foreach (DataGridViewRow lRow in lRows.Where(row => row.index > 4)) { ... } 

¿Hay alguna manera de que pueda convertir mi DataGridViewRowCollection a IEnumerable<> sin usar esa primera declaración larga? Lo mismo se aplica a DataGridViewCellCollection y DataGridViewColumnCollection.

ps. Estoy usando .NET Framework 3.5

Respuesta

30

Sí, hacer esto:

var rows = yourDataGridViewRowCollection 
       .Cast<DataGridViewRow>() 
       .Where(row => row.index > 4); 

Este utiliza el método de extensión Enumerable.Cast:

El método Cast<TResult>(IEnumerable) permite a los operadores de consulta estándar que se invoca en colecciones no genéricas proporcionando el tipo de información necesaria . Por ejemplo, ArrayList no implementa IEnumerable<T>, pero llamando Cast<TResult>(IEnumerable) en el objeto ArrayList, la consulta estándar operadores puede entonces ser utilizado para consultar la secuencia.

+0

Brillante. Gracias. – Mashmagar

+2

Para el registro, 'OfType ()' también es una opción viable. La única diferencia es que 'OfType' descartará cualquier cosa que no pueda convertir, y' Cast' lanzará una excepción. – Bobson