2011-03-14 22 views
6

Tengo una DataTable, digamos pdt, en mi código. Solo quiero seleccionar todos table["id"] y completarlos en una matriz de enteros.¿Cómo obtengo la lista de identificadores como int usando LINQ

Puedo seguir adelante con un foreach pero estoy tratando de aprender expresiones Lambda. No puedo entender cómo lidiar con esto.

He tratado

List<int> Ids = pdt.Select(row => row["Id"]; return Convert.ToInt32(r)); 

y

int[] Ids = pdt.Select(row => row["Id"]); 

pero nada parece funcionar. Estoy bastante seguro de que esta es una pregunta básica, ayuda a un novato, por favor.

+0

Hoy en día se puede hacer como 'identificadores de var = yourObject.Select (x => x.Id) .ToList();' –

Respuesta

21

Si desea una matriz, es necesario utilizar el método ToArray() extensión ... pero también desea utilizar el método DataTableExtensions.AsEnumerable() extensión para hacer la tabla de datos con establecimiento inflexible en términos de una secuencia de DataRow:

int[] ids = pdt.AsEnumerable() 
       .Select(r => (int) r["Id"]) 
       .ToArray(); 

EDIT: Como se señaló en la respuesta de abatishchev, una alternativa a la conversión explícita en este caso sería utilizar el método Field<T> extensión (en DataRowExtenions):

int[] ids = pdt.AsEnumerable() 
       .Select(r => r.Field<int>("Id")) 
       .ToArray(); 
+0

excellente, Gracias. – iamserious

2

uso con seguridad de tipos de llamadas:

r.Field<string>("Id") 
+1

No creo que sea un duplicado de eso en absoluto. Eso fue convertir una matriz de cadenas ... esto es convertir el campo 'Id' en cada fila en una tabla de datos. En particular, no creo que su código funcione, dado que todo lo que sabemos de la entrada es la variable 'pdt' -' r' solo se presenta como un parámetro de expresión lambda. –

+1

¿Por qué agregar una respuesta si ya votó para cerrar como duplicado? – ChrisF

+0

@Jon: tienes razón. 'AsEnumerable()' + 'Select()' es lo que OP necesita – abatishchev

Cuestiones relacionadas