【问题标题】:For loop through DataTable and set values extremely slowFor循环遍历DataTable并设置值非常慢
【发布时间】:2016-03-19 06:24:52
【问题描述】:

我有 2 个对象,一个 dataset.datatable 和一个 sortedDictionary。我的dataset.datatable 中有多达几百万条记录,我需要检查sortedDictionary 中的每个数字是否存在于dataset.datatable 中,如果是,我必须更新该行的第二列值(它是一个布尔值)。

foreach (var item in UpdatePhones)
{
    //Run through every record
    for (var i = 0; i < objDataSet.Tables[0].Rows.Count; i++)
    {
        //Check if exists
        if (Convert.ToString(objDataSet.Tables[0].Rows[i][0]) == item.Key)
        {
            //If so, update second column value
            objDataSet.Tables[0].Rows[i][1] = item.Value;
        }
    }
}

我的方法需要 1 个多小时来更新 1,000,000 行中的 3000 个项目dataset.datatable。有没有更快的方法?

编辑:我找到了一个非常简单的解决方案,但让我大吃一惊的是它可以双向工作:S

 foreach (var item in UpdatePhones)
 {
     DataRow[] row = objDataSet.Tables[0].Select("Number = " + item.Key);
     hrow[0][1] = item.Value;
 }

【问题讨论】:

  • 您正在对照整个表格检查 UpdatePhones 中的每个项目。您只需要对照字典检查表格,直到找到匹配项,对吧?是字典和表是1:1的对应关系,还是字典中的某些值在表中出现多次?我会使用 PLINQ 选择表中没有字典条目的每一行,然后您可以将这些行传递给更新其布尔值的函数。也可以先阅读您要检入其自己的集合的列。
  • 是的,我知道我正在检查每一项......但我不知道如何对照我的字典检查表格。我可能有 100 万条连续记录和 3000 个要检查的数字。 “UpdatePhones”字典仅包含我数据库中已有的号码,这些号码也必须全部更新

标签: c# database loops datatable dataset


【解决方案1】:

您需要提供正确的列名才能使其正常工作。

    List<DataRow> rows = objDataSet.Tables[0].Rows.Cast<DataRow>().ToList();
    var query = from row in rows.AsParallel()
        where UpdatePhones.Contains(Convert.ToString(row.Field<string>("Phone")))
        select row;
    query.ForAll((r) => UpdateThePhone(r));


    void UpdateThePhone(DataRow row)
    {
        row.SetField("YourBooleanColumn", true);
    }

我不得不做出一些猜测,比如假设当值在字典和表中时,您将第二列设置为 true。当字典也没有字符串时,您提供的代码也不会将该值设置为 false。

【讨论】:

  • 我用一个解决方案编辑了我的代码,它遍历每个数字来更新并在找到它时填充一个 DataRow,然后我设置该行的第二列值,毕竟我用 DataAdapter 更新了数据库。 ..它有效! > 我觉得很奇怪,我创建了一个列,它神奇地向后运行并更新我的数据集:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 2015-12-26
  • 2016-03-27
  • 2011-11-01
相关资源
最近更新 更多