grid_A と grid_B という名前の 190000 以上のレコードをそれぞれ含む 2 つのグリッドがあるとします。
grid_A のすべてのレコードについて、grid_B に同じレコードがあるかどうかを調べたい。
grid_A と grid_B には同じ列があります。私の場合、それらの列は
col1 col2 col3 col4
そしてそれらのデータ型は
文字列 datatime double
今では、私がしていることは次のとおりです。
grid_A の各行について、grid_B のすべての行をループし、4 つの列を比較します。
一つずつ。
コードは次のとおりです。
//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 データベースまたはテーブルがありません。