2014-05-18 97 views
0

假设我们有一个有100列和100行的DataTable。 我们有值的这样一个包含100个成员的字典:更新数据表的最快方法

Dictionary<int, string> dictionary = GetValues(); 

在上述辞典键是数据表的索引和字典的值就是我们要DataTable中更新目标值。

更新Datatable的最快方法是什么?我用这种方式,但它很慢:

 foreach (var pair in dictionary) 
     { 

      timeTable.Rows[pair.Key].SetField(columnIndex, pair.Value); 
     } 

假设我们必须更新40列的所有行,它没有良好的性能。我在想Datatable就像是一个矩阵,当你想在Matrix上更新一个单元格时,如果你有行和列的索引,它应该不需要时间。

+0

你是什么意思的“慢”?有什么措施?另外它是需要时间的“GetValues()”方法,还是仅用于foreach本身? – quantdev

+1

100x100在数据方面很小。 – TomTom

回答

1

DataTable是一个非常昂贵的结构,在后台做很多事情(特别是因为它们被设计为处理任何事情)。

如果性能是关键的考虑:

  • 创建自己的结构,如类封装的字符串数组的数组(例如字符串矩阵,在其访问会非常快)

  • 并行更新表(因为你永远不会访问同一行),因为知道DataTable对写操作不是线程安全的。

例如,

// Probably not thread safe, after the MSDN documentation 
Parallel.ForEach(Dictionary, pair => 
    { 
     timeTable.Rows[pair.Key].SetField(columnIndex, pair.Value); 
    }); 

编辑:这不会在一般的情况下工作(即使在不同的行写操作可能会影响DataTable的全局状态,所以我建议你去用自己的结构,如果性能是至关重要的,如果你不需要DataTable的特定功能)

+0

谢谢卡里姆,请您提供关于并行更新的示例吗? – Shahin

+0

这是正确的,它会引发异常,实际上,因为我已将DataTable绑定到DataGrid我不能使用任何其他结构,以及我意识到绑定到DataGrid的对象列表的可能性,但在我的场景中,用户可能会生成额外的列运行时间,这就是为什么我使用DataTable – Shahin

相关问题