字典项的问题

时间:2013-02-06 05:24:52

标签: c#

我遇到了一个问题,并不确定发生了什么,希望有人可以提供帮助!

我正在从数据库中收集条目并将它们放在列表集合中,我使用此列表集合来填充“活动”事物的字典,我使用列表作为模板,“活动”条目项是所有这些都将被操作,直到删除“活动”的东西,并且从列表集合中将“活动”事物的新实例插入到字典中。我看到的问题是列表集合中的项目正在更新以及字典项目。

这至少对我来说是一个问题。我可能正在做一些可怕的错误,希望有人可以提供更好的解决方案。

例如:

  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);
    }


}

3 个答案:

答案 0 :(得分:2)

您的ActiveListdataCollection都指向相同的DataEntry个实例。

在将Copy插入ActiveList之前,您必须先创建foreach (DataEntry de in dataCollection) { ActiveList.Add(activeIndex++, new DataEntry(de)); } 数据项。请参阅Writing a copy constructor

然后做:

{{1}}

答案 1 :(得分:1)

DataEntry是一个类,因此是一个引用类型。 List和Dictionary都不是您期望的数据集合,而是引用到内存中数据的集合 - 因此,两个集合都“指向”相同的DataEntry项。当您更改“列表内”的dataEntry项的值时,它会更改内存中的单个实例。当你说“列表集合中的项目正在更新以及字典项目”时,只有一个项目,只有两个集合指向它。 也许搜索“参考类型VS值类型”等...

编辑:看一下关于Value + Reference类型的这篇文章,它也描述了Heap vs Stack(一个基础,它可能更多地向你解释......) http://msdn.microsoft.com/en-us/magazine/cc301717.aspx

答案 2 :(得分:0)

正如Mitch指出的那样,您正在存储对同一对象的引用。从本质上讲,您创建了一堆DataEntry个对象并将它们放在List中,但是当您构建Dictionary时,您正在添加对List中相同对象的引用{1}}。

// 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类中使用构造函数?