c# - 为什么我的 dictionary 数据被覆盖?

不知道这里发生了什么。当我将数据更新到第二个条目时,我在第一个 dictionary 条目中的 store 数据项会被覆盖。 dictionary 的第一个条目就像它使用对原始对象的引用一样,所以当我更改它时,dictionary 中的所有实例都会更改。第一组数据是 1,2,3 并存储在 partitionInfo[0] 中。当我到达 store 下一组数据时,4,5,6 partitionInfo[1] 会更新,但 parttionInfo[0] 也会更新那些 values。所以我最终得到我的两个 dictionary 条目具有相同的数据集。但是字符串保持唯一。我所看到的表示代码

private void button1_Click(object sender, EventArgs e)
    {
        Datum dataItems = new Datum();
        Partition partitionItem = new Partition();
        LRU lruItem = new LRU();

        dataItems.minData = "1";
        dataItems.maxData = "2";
        dataItems.avgData = "3";
        partitionItem.partitionInfo.Add("Entry1", dataItems);


        dataItems.minData = "4";
        dataItems.maxData = "5";
        dataItems.avgData = "6";
        partitionItem.partitionInfo.Add("Entry2", dataItems);

        lruItem.lruInfo.Add("Parent", partitionItem);

    }


public class LRU
{
    public Dictionary<string, Partition> lruInfo = new Dictionary<string, Partition>();
}

public class Partition
{
  public Dictionary<string, Datum> partitionInfo = new Dictionary<string, Datum>();
}

public class Datum
{
    public string minData;
    public string maxData;
    public string avgData;

}

回答1

您正在覆盖以 dataItems.minData = "4"; 行开头的 values 只是因为您已将 value 存储在 Entry1 中,它并没有像我怀疑的那样“将其锁定”。

你原来的评论:

dictionary 的第一个条目的行为就像它使用对原始对象的引用,所以当我更改它时,dictionary 中的所有实例都会更改

您即将掌握代码中的错误...

查看固定代码:

Partition partitionItem = new Partition();

Datum dataItems = new Datum(); 
// **** It's better to declare your variables just
// before you use them to make it clearer ****
dataItems.minData = "1";
dataItems.maxData = "2";
dataItems.avgData = "3";
partitionItem.partitionInfo.Add("Entry1", dataItems);


dataItems = new Datum(); // **** ADDED LINE ****

// We now have a new block of memory containing a `Datum` 
// the one above is left untouched
dataItems.minData = "4";
dataItems.maxData = "5";
dataItems.avgData = "6";
partitionItem.partitionInfo.Add("Entry2", dataItems);

LRU lruItem = new LRU(); **** Moved, as before ****
lruItem.lruInfo.Add("Parent", partitionItem);

相似文章

java - 优化SQLITE到store大量词

我正在尝试用SQLite数据库替换我们保存在内存中的大文本文件。我们有这个大文件,其中包含我们在用户创建新密码时拒绝的常用密码。它大约有4M行,磁盘上有41MB(未压缩,压缩为11MB)。我们历史上在...