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


}
4

3 回答 3

2

ActiveListdataCollection都指向相同的DataEntry实例。

您必须先创建一个CopydataEntry,然后再将其插入ActiveList. 请参阅编写复制构造函数

然后做:

foreach (DataEntry de in dataCollection)
{
    ActiveList.Add(activeIndex++, new DataEntry(de));
}
于 2013-02-06T05:35:06.447 回答
1

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

编辑:查看这篇关于值 + 引用类型的文章,其中还描述了堆与堆栈(可能会向您解释更多的基础......) http://msdn.microsoft.com/en-us/magazine/cc301717。 aspx

于 2013-02-06T05:37:00.247 回答
0

正如 Mitch 指出的那样,您正在存储对同一对象的引用。本质上,您正在创建一堆DataEntry对象并将它们放置在您的.ListDictionaryList

// 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对象,但在List和 中对对象的两个引用Dictionary。因为它们都指向同一个DataEntry对象,所以如果你修改存储在其中一个中的对象,或者所做ListDictionary更改将立即反映在另一个中。

DataEntry另外,你没有在类中使用构造函数是有原因的吗?

于 2013-02-06T05:38:14.957 回答