我正在处理2个DataTables:
我需要在这些表之间匹配的值是整数,两个表都从小到大排序。 我的想法是开始搜索FFE中的第一项,开始循环浏览SSFE,当我找到匹配时 - >记住当前索引 - >保存匹配 - >从FFE中选择下一个项目并从上一个索引继续。
FFE也可以包含整数,但也可以包含字符串,这就是我将值转换为字符串并进行比较的原因。
我制作了一些代码,但需要花费太多时间。 将SSFE(1.000项)与FFE(127.000)项目进行比较需要大约一分钟。
int whereami = 0;
bool firstiteration = true;
for (int i = 0; i < FFEData.Rows.Count - 1; i++)
{
for (int j = 0; j < SSFEData.Rows.Count - 1; j++)
{
if (firstiteration)
{
j = whereami;
firstiteration = false;
}
if (SSFEData.Rows[j][0] == FFEData.Rows[i][0].ToString())
{
found++;
whereami = j;
firstiteration = true;
break;
}
}
}
我只存储了我发现的测试次数。在这个例子中,它将找到490个匹配,而不是相关。
任何建议都会很棒!
答案 0 :(得分:0)
可以尝试DataRelation类。它在DataSet中的两个DataTable之间创建外键/连接。
using System.Data;
using System.Text;
public int GetMatches(DataTable table1, DataTable table2)
{
DataSet set = new DataSet();
//wrap the tables in a DataSet.
set.Tables.Add(table1);
set.Tables.Add(table2);
//Creates a ForeignKey like Join between two tables.
//Table1 will be the parent. Table2 will be the child.
DataRelation relation = new DataRelation("IdJoin", table1.Columns[0], table2.Columns[0], false);
//Have the DataSet perform the join.
set.Relations.Add(relation);
int found = 0;
//Loop through table1 without using LINQ.
for(int i = 0; i < table1.Rows.Count; i++)
{
//If any rows in Table2 have the same Id as the current row in Table1
if (table1.Rows[i].GetChildRows(relation).Length > 0)
{
//Add a counter
found++;
//For debugging, proof of match:
//Get the id's that matched.
string id1 = table1.Rows[i][0].ToString();
string id2 = table1.Rows[i].GetChildRows(relation)[0][0].ToString();
}
}
return found;
}
我随机填充了两个带有nvarchar(2)字符串的非索引表,每行包含10,000行。比赛耗时1秒,包括填充表格的时间。我平均会跑3500到4000场比赛。
但是,主要的警告是匹配的DataColumns必须是相同的数据类型。因此,如果两列都是字符串,或者至少整数存储为字符串,那么这将起作用。
但是如果一列是整数,则必须添加一个新列,并首先将整数作为字符串存储在该列中。字符串翻译将增加大量的时间。
另一个选项是将表上传到数据库并执行查询。大量上传可能需要几秒钟,但查询也将在一秒钟之内。所以仍然优于60秒+。