假设我有两个网格,每个网格包含 190000+ 条记录,名为 grid_A 和 grid_B,
对于 grid_A 中的每条记录,我想查找 grid_B 中是否有相同的记录。
grid_A 和 grid_B 具有相同的列,在我的情况下,它们的列是
col1 col2 col3 col4
他们的数据类型可能是
字符串数据时间双
到目前为止,我所做的是:
对于grid_A中的每一行,遍历grid_B中的所有行,并比较四个列
逐个。
代码显示如下:
//loop grid_A
foreach (UltraGridRow row in ultraGrid1.Rows)
{
List<object> lo = new List<object>();
for (int i=0;i<4;i++) //add col's value to ListA
{
lo.Add(row.Cells[i].Value);
}
//loop grid_B
foreach (UltraGridRow rowDist in ultraGrid2.Rows)
{
List<object> loDist = new List<object>();
for (int ii=0;ii<4;ii++) //add col's value to ListB
{
loDist.Add(rowDist.Cells[ii].Value);
}
if (CompareList(lo, loDist) == true) //compare two List
{
break;
}
}
}
// the function compare two List
private bool CompareList(List<object> a, List<object> b)
{
//Assert a.count==b.count
for (int i=0;i<a.Count;i++)
{
if (!CompareObject(a[i], b[i]))
return false;
}
return true;
}
//
private bool CompareObject(object oa, object ob)
{
// object is string
if (oa.GetType() == typeof(System.String))
{
try
{
string strOb = Convert.ToString(ob);
if (oa.ToString() == strOb)
return true;
else
return false;
}
catch
{
return false;
}
}
// object is datetime
if (oa.GetType() == typeof(System.DateTime))
{
try
{
DateTime dtOb = Convert.ToDateTime(ob);
if ((DateTime)oa == dtOb)
return true;
else
return false;
}
catch
{
return false;
}
}
//object is double
if (oa.GetType() == typeof(System.Double))
{
try
{
double ddOb = Convert.ToDouble(ob);
if ((double)oa == ddOb)
return true;
else
return false;
}
catch
{
return false;
}
}
return true;
}
我知道我的比较方法太笨了,实际上,每个循环循环花费 2.4 秒,即:190000 循环花费 130 小时,看起来很糟糕,我听说它可以使用哈希表来加速搜索性能,但我不知道如何使用它。无论如何,对于 grid_A 中的每条记录,搜索 grid_B 中的所有记录是不可接受的,所以任何帮助都是不胜感激的。
我的网格数据是从 excel 导入的,所以它没有 sql 数据库或表。