0

我的数据集有一个自定义排序方法。我这样称呼它:

ds.Sort("列");

其中 ds 是数据集类型。然后我对第一个表进行排序(排序代码本身不相关,因为断点显示结果正确)。我的排序方法如下所示:

public static void Sort(this DataSet ds, string column)
{
    DataSet newDs = ds.Copy();

    //sorting occurs

    ds = newDs.Copy();
} // <- breakpoint

在断点处,ds 和 newDs 都按应有的方式排序。但是,一旦我在调用此排序方法后前进并到达该行, ds 将不再排序。我也尝试过同样的操作

ds.Clear(); 

在那个 Sort 方法中,这次它起作用了。我不允许为对象赋值吗?有可能以某种方式做到这一点吗?

4

2 回答 2

5

我不允许为对象赋值吗?

您没有为object赋值。您正在为变量赋值......并且该变量是一个参数。在方法之外看不到对该参数值的更改,因为 C# 默认使用按值传递。例如,考虑以下代码:

static void Foo(string input)
{
    input = "In Foo";
}
...
string text = "hello";
Foo(text);
Console.WriteLine(text); // Still prints "hello"

如果您不理解这一点,请阅读我关于参数传递的文章以获取更多详细信息。

你可能想要这样的东西:

public static DataSet CopyAndSort(this DataSet ds, string column)
{
    DataSet newDs = ds.Copy();

    //sorting occurs
    return newDs; // No need to copy it *again*.
}

然后你可以使用:

ds = ds.CopyAndSort("column");
于 2013-07-30T09:56:47.513 回答
2

和...之间的不同

ds.Clear();

ds = newDs.Copy();

是第一个对DataSet您通过引用传入的对象进行操作ds,而第二个将新对象重新分配给该变量,从而使您的扩展方法无法访问原始对象。

您可以使用Merge方法作为后门,用排序数据填充原始数据集:

ds.Reset();
ds.Merge(newDs);

这将起作用,因为数据将被复制到原始DataSet.

于 2013-07-30T09:57:26.220 回答