对数据表进行排序会影响参考数据表

时间:2012-06-28 10:11:58

标签: c# datatable

我有一个类似于下面写的方法(这只是我在C#中使用的伪代码):

function GenerateChart(DataTable dt)
{
    DataTable dtChartTable = dt;
    dtChartTable.DefaultView.Sort = "SomeColumnName";
    //remaining functionality
}

以上代码的作用是它还对dt中的记录进行排序。我不明白为什么会这样做。就像一个注释:这个函数是从两个不同的地方调用的。在一个地方,我发送一个Datatable对象,另一个地方,Datatable直接来自存储在会话中的那个。

2 个答案:

答案 0 :(得分:1)

没错。 您正在将dtChartTable变量设置为由dt变量表示的相同内存。 因此,对dtChartTable进行排序会影响第二个使用的相同DefaultView属性。

如果您不想要此行为,可以使用

创建dt的副本
DataTable dtChartTable = dt.Copy();

但这很昂贵,因为这样每个数据流都是重复的 另一种可能性是创建一个新的DataView

DataView view = new DataView(dt);
view.Sort = "SomeColumnName";  
......

这不会影响原始的dt.DefaultView,您可以从这个新的DataView处理数据视图

答案 1 :(得分:1)

当你这样做时

DataTable dtChartTable = dt;

它创建一个新副本,但两者都引用内存中的相同位置,因为Datatable是引用类型,因此您的更改反映在其他位置。

取而代之的是

 DataTable dtChartTable = dt.Copy();

这使得复制并引用内存中的不同位置。一个中的变化不会反映在另一个中。