2016-02-23 58 views
-1

我有一個簡單的遞歸程序來查找給定字符串的所有不同的排列。我正在使用遞歸函數go()來計算排列,並使用List<char[]>來存儲排列。經過計算後,函數會檢查排列是否已經存在於List<char[]>中。如果沒有,它會被添加到列表<>中。不能在C#列表中添加新值<char[]>

現在,這裏是問題,排列得到完美計算,但是當我嘗試將它們添加到列表中,它不會添加當前值。這是添加的代碼。

List<char[]> l; 
public void go(char[] list, int k, int m) 
{ 
if (k == m) 
{ 
    Console.WriteLine(list); //print to check 
    l.Add(list); //add it to the list 
} 
// more code 
} 

現在對於輸入= ABC,我得到下面的輸出..

ABC 
ACB 
BAC 
BCA 
CBA 
CAB 

這是正確的,因爲我是直接打印出來。但是當我列出清單時,我就收到了。

ABC 
ABC 
ABC 
ABC 
ABC 
ABC 

現在我知道我只是在一個簡單的錯誤,但我找不出什麼。我已經嘗試了一堆不同的方式,但似乎沒有任何工作,我無法在互聯網上找到任何答案。 Here is the complete code

+0

@EugenePodskal能否詳細說明一下,我是c#中的新手,而且我不瞭解這與我的問題有什麼關係? –

+1

雖然你沒有顯示[再現問題](http://stackoverflow.com/help/mcve)的代碼,但顯然你的'char [] list'總是相同的引用,因此所有的' l.Add(list);'實際上添加了相同的值,將被以下調用改變。 'l'中的每一項都是**相同的**引用,它引用相同的數組,這個數組顯然可以只包含一個值。 –

+0

所以爲什麼它會在語句'Console.WriteLine(list)'中輸出正確的值,並且不會在下一個語句'l.add(list);'中的列表中添加正確的值,對於格式不正確的問題..雖然我已經添加了一個鏈接到問題的完整代碼和[這裏又是](https:// ideone。com/x4664R) –

回答

1

答案是在對你的問題的意見已經給,您遇到的問題是,該行:

l.Add(list); //add it to the list 

你在加入參考的「列表」陣列「l」列表中,您沒有製作數組的副本。所以基本上,你留下了一個列表,充滿了對同一個對象的引用。

嘗試修改此

List<char[]> l; 

List<string> l; 

和切換該代碼

l.Add(list); //add it to the list 

l.Add(new string(list)); //add it to the list 

我想你會收到預期的結果。 不同之處在於我們已經將數組(即引用類型)轉換爲字符串(表現得像數值類型)

+0

thnks man ...它工作... –

相關問題