データテーブルdtFooがあり、特定の条件を満たす行の数を取得したい。
編集:このデータはデータベースに保存されないため、SQLの使用はオプションではありません。
過去には、これを達成するために次の2つの方法を使用しました。
方法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つの問題です。私は、これらの方法のどれがパフォーマンスの点で最良であるのか(そしてなぜ!)、そして最も一般的に使用されているのか疑問に思っています。
また、望ましい結果を達成するためのより良い方法はありますか?
これを実現する簡単な方法の1つは、元の投稿に投稿されたものを1つのステートメントに結合することです。
int numberOfRecords = dtFoo.Select("IsActive = 'Y'").Length;
これを実現する別の方法は、Linqメソッドを使用することです。
int numberOfRecords = dtFoo.AsEnumerable().Where(x => x["IsActive"].ToString() == "Y").ToList().Count;
これには、System.Linq
。
int numberOfRecords = DTb.Rows.Count;
int numberOfColumns = DTb.Columns.Count;
int numberOfRecords = 0;
numberOfRecords = dtFoo.Select().Length;
MessageBox.Show(numberOfRecords.ToString());
これが速いかどうかはわかりませんが、少なくとも短いです:)
int rows = new DataView(dtFoo, "IsActive = 'Y'", "IsActive",
DataViewRowState.CurrentRows).Table.Rows.Count;
これを試して
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;
データがデータベースに保存されている場合、すべてのデータを取得してメモリでクエリを実行するよりも、データベースにクエリを送信する方が高速です。
3つ目の方法はデータセットへのlinqですが、これら3つの方法のいずれもパフォーマンスが大きく異なるとは思いません。