Подтвердить что ты не робот

Получение количества строк в datatable, соответствующих определенным критериям

У меня есть datatable, dtFoo и хотел бы получить количество строк, удовлетворяющих определенным критериям.

EDIT: эти данные не хранятся в базе данных, поэтому использование SQL не является вариантом.

В прошлом я использовал следующие два метода для этого:

Метод 1

int numberOfRecords = 0;
DataRow[] rows;

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

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

Метод 2

int numberOfRecords = 0;

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

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

Мой магазин пытается стандартизировать несколько вещей, и это одна из проблем, которые возникли. Мне интересно, какой из этих методов лучше всего подходит с точки зрения производительности (и почему!), А также наиболее часто используется.

Кроме того, существуют ли лучшие способы достижения желаемых результатов?

4b9b3361

Ответ 1

Одним из простых способов добиться этого является объединение того, что было опубликовано в исходном сообщении в одном выражении:

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

Другой способ добиться этого - использовать методы Linq:

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

Примечание: для этого требуется включить System.Linq.

Ответ 2

int numberOfRecords = DTb.Rows.Count;
int numberOfColumns = DTb.Columns.Count;

Ответ 3

int numberOfRecords = 0;

numberOfRecords = dtFoo.Select().Length;

MessageBox.Show(numberOfRecords.ToString());

Ответ 4

Не уверен, что это быстрее, но, по крайней мере, короче:)

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

Ответ 5

Попробуйте это

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

Ответ 6

Если данные хранятся в базе данных, быстрее будет отправлять запрос в базу данных, а не получать все данные и запрашивать их в памяти.

Третий способ сделать это будет linq для наборов данных, но я сомневаюсь, что любой из этих 3 методов сильно отличается по производительности.

Ответ 7

object count =dtFoo.Compute("count(IsActive)", "IsActive='Y'");