我遇到了一个问题,并不确定发生了什么,希望有人可以提供帮助!
我正在从数据库中收集条目并将它们放在列表集合中,我使用此列表集合来填充“活动”事物的字典,我使用列表作为模板,“活动”条目项是所有这些都将被操作,直到删除“活动”的东西,并且从列表集合中将“活动”事物的新实例插入到字典中。我看到的问题是列表集合中的项目正在更新以及字典项目。
这至少对我来说是一个问题。我可能正在做一些可怕的错误,希望有人可以提供更好的解决方案。
例如:
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);
}
}
答案 0 :(得分:2)
您的ActiveList
和dataCollection
都指向相同的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
个对象,但有两个对List
和Dictionary
中对象的引用。因为它们都指向相同的DataEntry
对象,如果您修改存储在List
或Dictionary
中的对象,则更改将立即反映在另一个中。
另外,您是否有理由不在DataEntry
类中使用构造函数?