2011-12-21 66 views
3

這個時候我有一個C#編程問題: 我有一個列表的列表:C#列表清單 - 如何使列表中的列表具有唯一性和版本抵抗性?

List<List<string>> List1 

和字符串的出現在該列表:與

List<string> List2 

,環路,我想把List2放在List1中,但是我想改變List2中的值,但是我不想在List1中插入的​​List2中更改這個值。 這裏是什麼,我想這樣做(因爲我想沒有人得到我想要的東西的那一刻)僞代碼的例子:

List1 <=> ['one', 'two', 'three'] 
List2[1] <=> List1 
List1.clear 
List1 <=> ['four', 'five', 'six'] 
List2[2] <=> List1 

,但在列表1更改列表2 [1]太 - 我不知道想要那個!它看起來像現在:

List2[1] <=> ['four', 'five', 'six'] 
List2[2] <=> ['four', 'five', 'six'] 

但我想,這將是:

List2[1] <=> ['one', 'two', 'three'] 
List2[2] <=> ['four', 'five', 'six'] 

有什麼意義?我希望這些List1保持這種狀態,當我將它們插入到List2中時會發生什麼。我希望有人能理解這一點,並會幫助我。 我知道我在List2中插入了一些List1指針,但是如何使它正確? (右鍵 - >我希望它的工作^^的方式)

+0

什麼是'<=>'語法?它不是一些我認識的... – Chris 2011-12-21 14:20:29

+1

@Chris你需要再次閱讀這篇文章:「......這裏是僞代碼的例子......」 – 2011-12-21 14:56:19

+0

Mark:啊,好的。我通常只會使用一個等於或某些東西,這就是爲什麼我認爲它可能更有趣。 – Chris 2011-12-21 15:06:52

回答

11

你想要把一個複製的List1List2

List2[1] = List1.ToList(); 

否則,List1List2[1]List2[2]引用相同的列表,所以通過改變一個,你也在改變其他人。

+0

究竟!我感到很蠢,因爲解決方案非常簡單-_-「這很快,謝謝你! – mrmnmly 2011-12-21 14:20:33

+0

我認爲這個解決方案有可能隱藏一些問題。爲什麼List1必須是您要添加到List2的那個?這聽起來像你正在調用一些其他函數來獲取值List1。如果是這種情況,只需在循環中調用該函數並將結果賦給List2即可。如果另一個函數直接設置List1,那麼這就是我正在談論的問題。你必須學會​​將變量範圍限制在必要的範圍內,並且你的代碼將更易於維護和閱讀。 – Milimetric 2011-12-21 14:36:10

+0

@Milimetric:我同意你的觀點,List1可能不是必須的。但是,如果不知道究竟是什麼,那麼很難給出進一步的建議。 – 2011-12-21 14:42:52

3

您需要爲外部列表中的每個項目創建一個新列表。請記住,您正在對外部列表中的內部列表進行引用,而不是副本。

outerList.Add(new List<string>{"one", "two", "three"}) 
outerList.Add(new List<string>{"four", "five", "six"}) 
-1

爲了達到您想要的效果,您需要存儲您希望修改的列表的副本。您可以通過創建新列表並通過手動添加原始元素或使用擴展方法ToList(...)來完成此操作。這將創建您的原始列表的副本,並將其存儲,以便您可以修改原始列表而不影響副本。

+0

對於負面選民:當我重新閱讀這個問題並且意識到我誤解了它時,我已經改變了我的答案。如果您覺得他們仍然堅持下來,請查看downvotes和評論。 – 2011-12-21 14:21:21

+0

也許你已經看過其他答案,然後更新以前的答案。無論如何,我並不是第一個投票的人;) – 2011-12-21 15:06:42

1

我們瞭解。 List1是「改變」的原因是因爲List1是指向存儲其項目的內存中的地方的指針。所以當你分配List2 [1] = List1時,你只是創建另一個名爲List2 [1]的指針到內存中的同一個地方。

要完成您所談論的內容,您必須在每次通過循環時創建一個新列表。例如:

List two = new List<List<string>>(); 
for (int i = 0; i < 5; i++) { 
    List one = new List<string> {"one" + i, "two" + i, "three" + i}; 
    two.Add(one); 
} 

在每次通過此循環時,List one將是一個新對象。最後,列表2將包含這些值:

[[「one1」,「two1」,「three1」],[「one2」,「two2」,「three2」],...]

您可以按照您的意願生成任何值,但我只是展示了一個基於循環計數器使其動態化的示例。

1

這是我所知道的一個答案。如果要存儲列表的副本而不是原始參考,則必須執行深層複製操作。不幸的是,深層複製不是框架的一部分。

通過AT http://weblogs.asp.net/jeff/archive/2005/11/21/431125.aspx用我自己的編輯博客上的評論者「卡爾」(http://openmymind.net/)添加到例如......你可以序列化和反序列化的列表,你會得到清單的真實副本:

List<string> strings = new List<string>(); 
// Do something to populate the list 

BinaryFormatter bf = new BinaryFormatter(); 
MemoryStream ms = new MemoryStream(); 

bf.Serialize(ms, strings); 
ms.Seek(0, SeekOrigin.Begin); 
List<string> copy = (List<string>)bf.Deserialize(ms) ; 
ms.Close();