2013-02-06 74 views
0

我遇到了一個問題,並不確定發生了什麼,希望有人可以幫助!問題與字典項目

我收集來自數據庫的條目並將它們放置在列表集合中,我使用此列表集合來填充「活動」事物的字典,我將該列表用作模板並將「列表」作爲項目都將被操縱,直到一個「主動」事物被刪除,並且一個新的「主動」事件實例被從列表集合中插入到字典中。我看到的問題是列表集合中的項目正在更新以及字典項目。

這對我來說至少是個問題。我可能做了一些可怕的錯誤,希望有人能提供更好的解決方案。

例如:

public class DataEntry 
    { 
     public string DataOne { get; set; } 
     public int DataTwo { get; set; } 

    } 

public static List<DataEntry> dataCollection = new List<DataEntry>(); 
public static Dictionary<int, DataEntry> ActiveList = new Dictionary<int, DataEntry>(); 
private static int activeIndex = 0; 

public static void LoadListFromDB() 
{ 

    dataCollection.Add(new DataEntry() { DataOne = "Lakedoo", DataTwo = 25 }); 


    foreach (DataEntry de in dataCollection) 
    { 
     ActiveList.Add(activeIndex++, de); 
    } 


    for (int i = 0; i < 5; i++) 
    { 
     ActiveList[0].DataTwo -= 2; 
    } 

    if (ActiveList[0].DataTwo < 25) 
    { 
     ActiveList.Remove(0); 
    } 

    foreach (DataEntry de in dataCollection) 
    { 
     ActiveList.Add(activeIndex++, de); 
    } 


} 
+2

作爲參考..... –

+0

呃,我不清楚你想要達到什麼目的。 –

+0

而不是每次查詢數據庫的數據模型,我只是想把它放在一個集合中,然後用一個可以操縱的數據的「實例」填充我的字典,直到不再需要該實例,然後插入字典中原始數據的新實例。 – lakedoo

回答

2

無論您ActiveListdataCollection都指向同一個DataEntry實例。

在將數據插入到ActiveList之前,您必須先製作一個數據條目的Copy。見Writing a copy constructor

然後做:

foreach (DataEntry de in dataCollection) 
{ 
    ActiveList.Add(activeIndex++, new DataEntry(de)); 
} 
+0

非常感謝你,我會嘗試實施! – lakedoo

1

的DataEntry是一個類,因此,引用類型。您的列表和字典都不像您所期望的那樣是數據的集合,就像的集合將引用到內存中的數據一樣 - 因此,這兩個集合都「指向」相同的DataEntry項目。當您更改「列表內」的dataEntry項目的值時,它會更改內存中的單個實例。當你說「列表集合中的項目正在更新以及字典項目」時,那麼只有一個項目,只是兩個集合都指向它。 可能搜索「引用類型VS值類型」等...

編輯:看看這篇關於Value + Reference類型的文章,它也描述了堆棧vs堆棧(可能會更多地解釋它的基本原理...... ) http://msdn.microsoft.com/en-us/magazine/cc301717.aspx

0

正如Mitch指出的那樣,您正在存儲對同一對象的引用。本質上,您正在創建一堆DataEntry對象並將它們放在您的List中,但是當您構建Dictionary時,您將添加對List中相同對象的引用。

// Create a DataEntry object 
DataEntry de = new DataEntry() { DataOne = "Lakedoo", DataTwo = 25 }; 

// Add it to the List object 
dataCollection.Add(de) 

// Add it to the Dictionary object 
ActiveList.Add(activeIndex++, de); 

此時你有一個DataEntry對象,但在ListDictionary對象兩個引用。因爲它們都指向相同的DataEntry對象,所以如果修改存儲在ListDictionary中的對象,則更改將立即反映在另一個對象中。

此外,有沒有原因你沒有在DataEntry類中使用構造函數?