在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