日期:2014-05-17  浏览次数:21114 次

双层for循环优化
今天测试代码时,发现耗时最多的就出现在以下这个循环中,其中当ds.Tables[0].Rows.Count、dst.Tables[0].Rows.Count数过万时,就特别明显了。
  for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
  {
  for (int j = 0; j < dst.Tables[0].Rows.Count; j++)
  {
   
  if (ds.Tables[0].Rows[i]["code"].ToString() == dst.Tables[0].Rows[j]["code"].ToString())
  {
  dst.Tables[0].Rows[j]["name"] = ds.Tables[0].Rows[i]["name"];
  dst.Tables[0].Rows[j]["price"] = ds.Tables[0].Rows[i]["price"];
  }
   
  }
  }

哪位高手帮指点下

------解决方案--------------------
既然有相等判断,其实你之前先花时间做一个排序会好一些。那么判断是否存在相等记录,只要二分查找就可以了。
------解决方案--------------------
你这种情况直接用Hash表就可以了,性能远高于先排序再用二分查找。时间复杂度仅为 ds的行数 + dst的行数


C# code
            Dictionary<string, DataRow> dict = new Dictionary<string,DataRow>();
            foreach (DataRow row in ds.Tables[0].Rows)
            {
                dict[row["code"].ToString()] = row;
            }
            foreach (DataRow row in dst.Tables[0].Rows)
            {
                DataRow dr;
                if(dict.TryGetValue(row["code"].ToString(), out dr))
                {
                    row["name"] = dr["name"];
                    row["price"] = dr["price"];
                }
            }

------解决方案--------------------
C# code

for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
string code = ds.Tables[0].Rows[i]["code"].ToString();
DataRow[] find dst.select("code = '"+code+"'");
if(find.length>0)
{
你的赋值语句
}
}