2013-07-30 44 views
0

我對我的數據集有一個自定義排序方法。我這樣稱呼它:不分配值的擴展方法

ds.Sort(「column」);

其中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(); 

在那個排序方法,這次它的工作。我不允許爲對象分配一個值嗎?有沒有可能以某種方式做到這一點?

+0

我從來沒有用'DataSet'試過它,但它工作嗎? 'ds = ds.Sort(「column」);' – FSou1

+0

這不是一個正確的答案,但是在返回newDs的副本時是否有任何問題? – KappaG3

+0

我想盡可能縮短。另外,'ds ='部分通常會被遺忘。 –

回答

5

我不允許爲對象賦值嗎?

您沒有爲對象分配值。您正在爲變量分配一個值...並且該變量是一個參數。在該方法之外沒有看到該參數值的更改,因爲默認情況下C#使用按值傳遞。因此,例如,考慮下面的代碼:

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"); 
+0

會有無數次我會忘記'ds ='部分雖然:( –

+0

Jon,'static void Foo(string input)'像擴展方法一樣工作嗎?而且「extesion方法」與「鏈調用」和「this」參數傳遞不同? – FSou1

+0

@AndriusNaruševičius:那麼你需要考慮另一種方法。你肯定*需要*採取副本,而不是排序到位? –

2

ds.Clear(); 

ds = newDs.Copy(); 
之間的區別3210

是第一個對DataSet對象進行操作,您通過引用ds傳入對象,而第二個對象將新對象重新分配給該變量,使原始對象無法訪問您的擴展方法。

您可以使用Merge方法作爲後門填充原始數據和排序的數據集:

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

這將起作用,因爲該數據將被複制到原來的DataSet