我的数据集有自定义排序方法。我称之为:
ds.Sort( “塔”);
其中ds的类型为dataset。然后我排序第一个表(排序代码本身不相关,因为断点显示结果是正确的)。我的排序方法如下:
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方法中,这次它起作用了。我不允许为对象分配值吗?是否有可能以某种方式做到这一点?
答案 0 :(得分:5)
我不允许为对象分配值吗?
您没有为对象分配值。您正在为变量分配值...并且该变量是一个参数。在该方法之外看不到对该参数值的更改,因为C#默认使用pass-by-value。例如,请考虑以下代码:
static void Foo(string input)
{
input = "In Foo";
}
...
string text = "hello";
Foo(text);
Console.WriteLine(text); // Still prints "hello"
如果您不明白,请阅读my article on parameter passing了解更多详情。
你可能想要这样的东西:
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");
答案 1 :(得分:2)
之间的区别
ds.Clear();
和
ds = newDs.Copy();
是第一个对您通过引用DataSet
传入的ds
对象进行操作,而第二个对象重新分配给该变量,使原始对象无法访问你的扩展方法。
您可以使用Merge
方法作为后门来填充带有排序数据的原始数据集:
ds.Reset();
ds.Merge(newDs);
这样可行,因为数据会被复制到原始DataSet
。