web-dev-qa-db-fra.com

Obtenir un nombre de lignes dans un datatable qui répondent à certains critères

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?

35
Sesame

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.

59
saluce
int numberOfRecords = DTb.Rows.Count;
int numberOfColumns = DTb.Columns.Count;
8
user7159980
int numberOfRecords = 0;

numberOfRecords = dtFoo.Select().Length;

MessageBox.Show(numberOfRecords.ToString());
3
user_SS

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;
2
Cosmin

Essaye ça

int numberOfRecords = dtFoo.Select("IsActive = 'Y'").Count<DataRow>();    
Console.WriteLine("Count: " + numberOfRecords.ToString());
1
Karthick Prakash
object count =dtFoo.Compute("count(IsActive)", "IsActive='Y'");
0
Zohaib Iqbal
int row_count = dt.Rows.Count;
0
Javed Alam

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.

0
Marcus