在C#(.NET 3.5)中,我用數據庫中的行填充了一個DataTable。在這個DataTable中大約有100到200個DataRows。我必須遍歷這個DataTable來檢查數據是否正確,我使用了27個檢查方法。首先,我試圖將DataTable傳遞給每個方法並對其進行循環。在我的第二次嘗試中,我循環了一次DataTable,並將DataRow傳遞給每個方法。之後,我對這兩種方法進行了基準測試,第一種方法比第二種方法更快?多次循環遍歷DataTable
使數據表循環27次需要13秒。
循環數據表1次花了18秒。
那麼對此有何解釋?什麼是通過DataTable循環查看數據的最快方法?
注意:基準測試是在開始排除連接速度到數據庫的檢查方法之前開始的。
第一種方法:
private void check()
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
checkStamnr();
checkVoornaam();
checkGebDatum();
...
sw.Stop();
sw.Reset();
}
private void checkStamnr()
{
foreach (DataRow dr in dtIdentificatieRecords.Rows)
{
if (dr["STAMNRVOL"] == null || dr["STAMNRVOL"].GetType() == typeof(DBNull) || dr["STAMNRVOL"].equals(""))
{
DatabankFout df = new DatabankFout("Stamnummer is leeg.");
listDBFouten.Add(df);
}
}
}
第二方法
private void check()
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
foreach (DataRow dr in dtIdentificatieRecords.Rows)
{
checkStamnr(dr);
checkVoornaam(dr);
checkGebDatum(dr);
...
}
sw.Stop();
sw.Reset();
}
private void checkStamnr(DataRow dr)
{
if (dr["STAMNRVOL"] == null || dr["STAMNRVOL"].GetType() == typeof(DBNull) || dr["STAMNRVOL"].equals(""))
{
DatabankFout df = new DatabankFout("Stamnummer is leeg.");
listDBFouten.Add(df);
}
}
類DatabankFout上請求:
public class DatabankFout
{
public DatabankFout(string reden, bool rood)
{
this.reden = reden;
this.rood = rood;
}
public DatabankFout(string reden) : this(reden, false)
{
}
public string reden { get; set; }
public bool rood { get; set; }
}
努力幫助沒有seing任何代碼... – 2012-02-07 08:25:24
增加了一些代碼;-) – Yoni 2012-02-07 08:32:46
如何重是你的'DatabankFout'類的,什麼是'listDBFouten'?要檢查哪種方法更快,您應該刪除兩者中相同的所有不相關的。循環100行肯定不能持續13/18秒(除非你在C64上),也許你已經使用了StopWatch並且在調試時忘記停止/重置(13毫秒更真實)。您不應傳遞wohole數據表或數據行,而應該只傳遞所需的數據 - 存儲在datacolumn中的數據。 – 2012-02-07 09:03:40