2011-03-09 10 views
29

Tengo una tabla de datos, dtFoo, y me gustaría obtener un recuento de las filas que cumplen con ciertos criterios.Obteniendo un recuento de filas en una tabla de datos que cumple con ciertos criterios

EDITAR: Estos datos no se almacenan en una base de datos, por lo que usar SQL no es una opción.

En el pasado, he usado los dos métodos siguientes para hacerlo:

Método 1

int numberOfRecords = 0; 
DataRow[] rows; 

rows = dtFoo.Select("IsActive = 'Y'"); 
numberOfRecords = rows.Length; 

Console.WriteLine("Count: " + numberOfRecords.ToString()); 

Método 2

int numberOfRecords = 0; 

foreach (DataRow row in dtFoo.Rows) 
{ 
    if (row["IsActive"].ToString() == "Y") 
    { 
     numberOfRecords++; 
    } 
} 

Console.WriteLine("Count: " + numberOfRecords.ToString()); 

Mi tienda está tratando para estandarizar en algunas cosas y este es un problema que ha surgido. Me pregunto cuál de estos métodos es el mejor en términos de rendimiento (¡y por qué!), Así como cuál es el más comúnmente utilizado.

Además, ¿hay mejores formas de lograr los resultados deseados?

Respuesta

50

Una manera fácil de lograr esto es la combinación de lo que se ha escrito en el post original en una sola declaración:

int numberOfRecords = dtFoo.Select("IsActive = 'Y'").Length; 

Otra forma de lograr esto es usando métodos Linq:

int numberOfRecords = dtFoo.AsEnumerable().Where(x => x["IsActive"].ToString() == "Y").ToList().Count; 

Nota esto requiere incluidos System.Linq.

+1

Excelente solución, ¿podría decirme alguna fuente donde pueda ver muchos ejemplos de LINQ? –

+0

@Saluce, dtFoo.AsEnumerable(). Donde (expr) no es necesario convertir a enumerable ya que podemos usar dtFoo.Where (expr) también es enumerable –

+1

@Sunny_Sid Eso no es correcto. Tienes que convertir explícitamente a 'Enumerable' para usar el' Enumerable.Where'. – saluce

0

Si los datos se almacenan en una base de datos, será más rápido enviar la consulta a la base de datos en lugar de obtener todos los datos y consultarlos en la memoria.

Una tercera forma de hacerlo será linq a datasets, pero dudo que ninguno de estos 3 métodos difiera mucho en rendimiento.

+0

Estos datos no se almacena en una base de datos. Edité mi entrada original para reflejar esto. – Sesame

2

No estoy seguro si esto es más rápido, pero al menos es más corto :)

int rows = new DataView(dtFoo, "IsActive = 'Y'", "IsActive", 
    DataViewRowState.CurrentRows).Table.Rows.Count; 
+0

¿Cómo es 'int rows = new DataView (dtFoo," IsActive = 'Y' "," IsActive ", DataViewRowState.CurrentRows) .Table.Rows.Count;' más corto que 'int rows = dtFoo.Select (" IsActive = 'Y' "). Longitud;'? – PedroC88

+0

@ PedroC88: No lo es; es más corto que los métodos del cartel original. – Cosmin

3
int numberOfRecords = 0; 

numberOfRecords = dtFoo.Select().Length; 

MessageBox.Show(numberOfRecords.ToString()); 
+2

@Sesame ya descrito dtFoo.Seleccione el enfoque en cuestión. Además, la pregunta era sobre contar por algunos criterios, no recuperar el número total de registros. – Alexander

+0

útil para mí gracias –

0
object count =dtFoo.Compute("count(IsActive)", "IsActive='Y'"); 
5
int numberOfRecords = DTb.Rows.Count; 
int numberOfColumns = DTb.Columns.Count; 
1

probar este

int numberOfRecords = dtFoo.Select("IsActive = 'Y'").Count<DataRow>();  
Console.WriteLine("Count: " + numberOfRecords.ToString()); 
Cuestiones relacionadas