Getting a count of rows in a datatable that meet certain criteria
Asked Answered
P

8

49

I have a datatable, dtFoo, and would like to get a count of the rows that meet a certain criteria.

EDIT: This data is not stored in a database, so using SQL is not an option.

In the past, I've used the following two methods to accomplish this:

Method 1

int numberOfRecords = 0;
DataRow[] rows;

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

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

Method 2

int numberOfRecords = 0;

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

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

My shop is trying to standardize on a few things and this is one issue that has come up. I'm wondering which of these methods is best in terms of performance (and why!), as well as which is most commonly used.

Also, are there better ways to achieve the desired results?

Photometer answered 9/3, 2011 at 22:18 Comment(0)
M
91

One easy way to accomplish this is combining what was posted in the original post into a single statement:

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

Another way to accomplish this is using Linq methods:

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

Note this requires including System.Linq.

Moran answered 9/5, 2012 at 17:54 Comment(3)
Excellent Solution, can you please let me know some source where I can get to see many examples of LINQ?Dorsoventral
@Saluce, dtFoo.AsEnumerable().Where(expr) does no need to convert to enumerable as we can use dtFoo.Where(expr) is also already enumerableInsult
@Insult That is not correct. You have to explicitly convert to Enumerable to use the Enumerable.Where.Moran
E
11
int numberOfRecords = DTb.Rows.Count;
int numberOfColumns = DTb.Columns.Count;
Erlond answered 15/11, 2016 at 3:56 Comment(0)
K
3
int numberOfRecords = 0;

numberOfRecords = dtFoo.Select().Length;

MessageBox.Show(numberOfRecords.ToString());
Kafiristan answered 30/4, 2014 at 12:17 Comment(1)
@Photometer already described dtFoo.Select approach in question. Besides, the question was about counting by some criteria, not retrieving total number of records.Disregardful
B
3
int row_count = dt.Rows.Count;
Burglar answered 1/11, 2018 at 8:10 Comment(0)
A
2

Not sure if this is faster, but at least it's shorter :)

int rows = new DataView(dtFoo, "IsActive = 'Y'", "IsActive",
    DataViewRowState.CurrentRows).Table.Rows.Count;
Arabele answered 10/3, 2011 at 17:18 Comment(2)
How is int rows = new DataView(dtFoo, "IsActive = 'Y'", "IsActive", DataViewRowState.CurrentRows).Table.Rows.Count; shorter than int rows = dtFoo.Select("IsActive = 'Y'").Length;?Exocarp
@PedroC88: It's not; it's shorter than the original poster's methods.Arabele
L
1
object count =dtFoo.Compute("count(IsActive)", "IsActive='Y'");
Liebermann answered 23/6, 2014 at 13:4 Comment(0)
L
1

Try this

int numberOfRecords = dtFoo.Select("IsActive = 'Y'").Count<DataRow>();    
Console.WriteLine("Count: " + numberOfRecords.ToString());
Lief answered 16/11, 2016 at 12:49 Comment(0)
N
0

If the data is stored in a database it will be faster to send the query to the database instead of getting all data and query it in memory.

A third way to do it will be linq to datasets, but i doubt any of these 3 methods differ much in performance.

Nazarius answered 9/3, 2011 at 22:25 Comment(1)
This data is not stored in a database. I edited my original entry to reflect this.Photometer

© 2022 - 2024 — McMap. All rights reserved.