C#比较2个DataTables中的值

时间:2015-04-14 18:59:59

标签: c# performance algorithm datatable compare

我正在处理2个DataTables:

  1. SSFE:包含我想要查找的值
  2. FFE:比SSFE更大,更小或同样大,但不一定包含SSFE的每个值
  3. 我需要在这些表之间匹配的值是整数,两个表都从小到大排序。 我的想法是开始搜索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个匹配,而不是相关。

    任何建议都会很棒!

1 个答案:

答案 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秒+。