C# 字典项的问题

C# 字典项的问题,c#,C#,我遇到了一个问题,不确定到底发生了什么,希望有人能帮上忙 我从数据库中收集条目并将它们放在列表集合中,我使用此列表集合填充“活动”事物的字典,我使用列表作为模板,“活动”条目项是所有将被操作的项,直到删除“活动”事物并创建“活动”的新实例将从列表集合中插入到字典中。我看到的问题是列表集合中的项以及字典项都在更新 至少对我来说这是个问题。我可能做错了什么,希望有人能提供更好的解决方案 例如: public class DataEntry { public string

我遇到了一个问题,不确定到底发生了什么,希望有人能帮上忙

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

至少对我来说这是个问题。我可能做错了什么,希望有人能提供更好的解决方案

例如:

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


}
公共类数据项
{
公共字符串DataOne{get;set;}
公共int DataTwo{get;set;}
}
公共静态列表数据收集=新列表();
公共静态字典ActiveList=新字典();
私有静态int-activeIndex=0;
公共静态void LoadListFromDB()
{
添加(newdataentry(){DataOne=“Lakedoo”,DataTwo=25});
foreach(数据收集中的数据条目de)
{
Add(activeIndex++,de);
}
对于(int i=0;i<5;i++)
{
ActiveList[0]。DataTwo-=2;
}
if(ActiveList[0].DataTwo<25)
{
ActiveList.Remove(0);
}
foreach(数据收集中的数据条目de)
{
Add(activeIndex++,de);
}
}

您的
ActiveList
dataCollection
都指向相同的
DataEntry
实例

在将数据项插入
ActiveList
之前,必须对其进行
复制。看

然后做:

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

您的
ActiveList
dataCollection
都指向相同的
DataEntry
实例

在将数据项插入
ActiveList
之前,必须对其进行
复制。看

然后做:

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

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

编辑:查看这篇关于值+引用类型的文章,这篇文章还描述了堆与堆栈的关系(这是一个基本原理,可能会对您进行更多解释…)
数据项是一个类,因此是一个引用类型。列表和字典都不是您期望的数据集合,而是内存中数据的引用集合,因此,两个集合都“指向”相同的数据条目项。当您更改“列表内”数据项的值时,它会更改内存中的单个实例。当您说“列表集合中的项以及字典项都在更新”时,那么,只有一个项,只有两个集合都指向它。 可能搜索“参考类型VS值类型”等

编辑:查看这篇关于值+引用类型的文章,这篇文章还描述了堆与堆栈的关系(这是一个基本原理,可能会对您进行更多解释…)

正如米奇指出的,您正在存储对同一对象的引用。基本上,您创建了一组
数据条目
对象,并将它们放在
列表
中,但当您构建
词典
时,您添加了对
列表中相同对象的引用

// 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);
此时,您有一个
数据条目
对象,但有两个对
列表
字典
中的对象的引用。因为它们都指向相同的
数据条目
对象,如果修改存储在
列表
字典
中的对象,则更改将立即反映在另一个对象中


另外,您是否有理由不在
数据项
类中使用构造函数?

正如Mitch指出的,您正在存储对同一对象的引用。基本上,您创建了一组
数据条目
对象,并将它们放在
列表
中,但当您构建
词典
时,您添加了对
列表中相同对象的引用

// 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);
此时,您有一个
数据条目
对象,但有两个对
列表
字典
中的对象的引用。因为它们都指向相同的
数据条目
对象,如果修改存储在
列表
字典
中的对象,则更改将立即反映在另一个对象中


还有,你不在
数据项
类中使用构造函数有什么原因吗?

呃,我不清楚你想实现什么。我不想每次都在数据库中查询数据模型,我只想把它保存在一个集合中,然后用一个“实例”填充我的字典在实例不再需要之前可以操作的数据,然后在字典中插入原始数据的新实例。呃,我不清楚您试图实现什么。与其每次查询数据库以获取数据模型,我只是想把它保存在一个集合中,然后用数据的“实例”填充我的字典,直到不再需要该实例为止,然后在字典中插入原始数据的新实例。