我有一个类似于下面写的方法(这只是我在C#中使用的伪代码):
function GenerateChart(DataTable dt)
{
DataTable dtChartTable = dt;
dtChartTable.DefaultView.Sort = "SomeColumnName";
//remaining functionality
}
以上代码的作用是它还对dt中的记录进行排序。我不明白为什么会这样做。就像一个注释:这个函数是从两个不同的地方调用的。在一个地方,我发送一个Datatable对象,另一个地方,Datatable直接来自存储在会话中的那个。
答案 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();
这使得复制并引用内存中的不同位置。一个中的变化不会反映在另一个中。