1

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

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

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

4

2 回答 2

1

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

如果您不想要这种行为,您可以使用创建 dt 的副本

DataTable dtChartTable = dt.Copy();

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

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

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

于 2012-06-28T10:16:43.397 回答
1

当你这样做

DataTable dtChartTable = dt;

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

而是做

 DataTable dtChartTable = dt.Copy();

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

于 2012-06-28T10:19:07.440 回答