• 在大型数据集上使用foreach
大部分开发人员更喜欢使用foreach循环,而无视for循环,因为foreach更容易使用,但操作大型数据集时,使用foreach已经被证明是代价高昂的,在下面的代码中,我同时使用for和foreach遍历相同的数据库,在图1中显示了两种循环方法消耗的时间。
static void Main(string[] args)
{
DataTable dt = PopulateData();
Stopwatch watch = new Stopwatch();
//For loop
watch.Start();
for (int count = 0; count < dt.Rows.Count; count++)
{
dt.Rows[count]["Name"] = "Modified in For";
}
watch.Stop();
Console.WriteLine("Time taken in For loop: {0}", watch.Elapsed.TotalSeconds);
//Foreach loop
watch.Start();
foreach (DataRow row in dt.Rows)
{
row["Name"] = "Modified in ForEach";
}
watch.Stop();
Console.WriteLine("Time taken in For Each loop: {0}", watch.Elapsed.TotalSeconds);
Console.ReadKey();
}
{
DataTable dt = PopulateData();
Stopwatch watch = new Stopwatch();
//For loop
watch.Start();
for (int count = 0; count < dt.Rows.Count; count++)
{
dt.Rows[count]["Name"] = "Modified in For";
}
watch.Stop();
Console.WriteLine("Time taken in For loop: {0}", watch.Elapsed.TotalSeconds);
//Foreach loop
watch.Start();
foreach (DataRow row in dt.Rows)
{
row["Name"] = "Modified in ForEach";
}
watch.Stop();
Console.WriteLine("Time taken in For Each loop: {0}", watch.Elapsed.TotalSeconds);
Console.ReadKey();
}
图 1 for和foreach循环遍历相同数据库消耗的时间对比
从上图可以看出,foreach循环明显要慢一些,它消耗的时间几乎是for循环的两倍,这是因为foreach循环中的dt.Rows要访问数据库中的所有行。因此需要遍历大型数据集时最好使用for循环。
• 验证简单的原始数据类型
大多数开发人员都不知道内置的验证原始数据类型的方法,如System.Int32,因此很多人都是自己实现的,下面就是一个自己实现的验证一个字符串是否是数值的代码:
public bool CheckIfNumeric(string value)
{
bool isNumeric = true;
try
{
int i = Convert.ToInt32(value);
}
catch(FormatException exception)
{
isNumeric = false;
}
return isNumeric;
{
bool isNumeric = true;
try
{
int i = Convert.ToInt32(value);
}
catch(FormatException exception)
{
isNumeric = false;
}
return isNumeric;
}
它使用了try catch语句,因此不是非常好的的做法,更好的办法是象下面这样使用int.TryParse:
int output = 0;
bool isNumeric = int.TryParse(value, out output);
bool isNumeric = int.TryParse(value, out output);
根据我的经验,int.TryParse是更快,更简洁的方法。