Получение количества строк в 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());
Мой магазин пытается стандартизировать несколько вещей, и это одна из проблем, которые возникли. Мне интересно, какой из этих методов лучше всего подходит с точки зрения производительности (и почему!), А также наиболее часто используется.
Кроме того, существуют ли лучшие способы достижения желаемых результатов?
Ответы
Ответ 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'");