J'ai un fichier datatable, dtFoo, et j'aimerais obtenir un décompte des lignes qui répondent à certains critères.
EDIT: Ces données n'étant pas stockées dans une base de données, l'utilisation de SQL n'est pas une option.
Dans le passé, j'ai utilisé les deux méthodes suivantes pour accomplir cela:
Méthode 1
int numberOfRecords = 0;
DataRow[] rows;
rows = dtFoo.Select("IsActive = 'Y'");
numberOfRecords = rows.Length;
Console.WriteLine("Count: " + numberOfRecords.ToString());
Méthode 2
int numberOfRecords = 0;
foreach (DataRow row in dtFoo.Rows)
{
if (row["IsActive"].ToString() == "Y")
{
numberOfRecords++;
}
}
Console.WriteLine("Count: " + numberOfRecords.ToString());
Mon magasin essaie de standardiser un certain nombre de choses et c'est un problème qui a été soulevé. Je me demande laquelle de ces méthodes est la meilleure en termes de performances (et pourquoi!), Ainsi que celle qui est la plus utilisée.
En outre, existe-t-il de meilleurs moyens d'atteindre les résultats souhaités?
Un moyen simple d’y parvenir consiste à combiner ce qui a été posté dans le message original en une seule déclaration:
int numberOfRecords = dtFoo.Select("IsActive = 'Y'").Length;
Une autre façon de faire consiste à utiliser les méthodes Linq:
int numberOfRecords = dtFoo.AsEnumerable().Where(x => x["IsActive"].ToString() == "Y").ToList().Count;
Notez que cela nécessite notamment System.Linq
.
int numberOfRecords = DTb.Rows.Count;
int numberOfColumns = DTb.Columns.Count;
int numberOfRecords = 0;
numberOfRecords = dtFoo.Select().Length;
MessageBox.Show(numberOfRecords.ToString());
Pas sûr que ce soit plus rapide, mais au moins c'est plus court :)
int rows = new DataView(dtFoo, "IsActive = 'Y'", "IsActive",
DataViewRowState.CurrentRows).Table.Rows.Count;
Essaye ça
int numberOfRecords = dtFoo.Select("IsActive = 'Y'").Count<DataRow>();
Console.WriteLine("Count: " + numberOfRecords.ToString());
object count =dtFoo.Compute("count(IsActive)", "IsActive='Y'");
int row_count = dt.Rows.Count;
Si les données sont stockées dans une base de données, il sera plus rapide d'envoyer la requête à la base de données au lieu de récupérer toutes les données et de l'interroger en mémoire.
Une troisième façon de le faire sera linq to datasets, mais je doute que l’une de ces 3 méthodes diffère beaucoup par ses performances.