C# 字典问题<;字符串,列表<;IRp>>;,覆盖数据

C# 字典问题<;字符串,列表<;IRp>>;,覆盖数据,c#,list,dictionary,C#,List,Dictionary,Hi I存储聊天对话的属性类型为: public Dictionary<string, List<IRp>> History { get; set; } 公共字典历史记录{get;set;} 键是尼克,列表是包含交流历史的集合 我使用存储这个SaveRp方法,IRp是实现消息类的接口 public void SaveRp(IRp rp) { if (!History.ContainsKey(rp.Nick)) {

Hi I存储聊天对话的属性类型为:

  public Dictionary<string, List<IRp>> History { get; set; }
公共字典历史记录{get;set;}
键是尼克,列表是包含交流历史的集合

我使用存储这个SaveRp方法,IRp是实现消息类的接口

    public void SaveRp(IRp rp)
    {
        if (!History.ContainsKey(rp.Nick))
        {
            History.Add(rp.Nick, new List<IRp> { rp });
        }
        else
        {
            History[rp.Nick].Add(rp);
        }
    }
public void SaveRp(IRp-rp)
{
如果(!History.ContainsKey(rp.Nick))
{
添加(rp.Nick,新列表{rp});
}
其他的
{
历史记录[rp.Nick]。添加(rp);
}
}
问题是我按此顺序为同一个Nick(例如Tom)存储消息:

1条短信:你好 2消息文本:如何 3信息文本:是 4短信:你呢? 问题是,如果我使用以下方法加载此nick的历史记录:

    public IList<IRp> GetRps(string nick)
    {
        var result=new List<IRp>();
        if (History.ContainsKey(nick))
        {
           result= History[nick];
        }
        return result;
    }
public IList GetRps(字符串)
{
var result=新列表();
如果(历史,康纳斯基(尼克))
{
结果=历史[尼克];
}
返回结果;
}
我明白了:

1条短信:你呢? 2短信:你呢? 3条短信:你呢? 4短信:你呢?
我认为这个bug一定是在SaveRp方法中,并且以某种方式覆盖/重写了

问题很可能是您正在更新添加到列表中的同一个Rp对象。将其添加到列表中时,将添加对对象的引用,这意味着如果该对象发生更改,则列表中的数据将发生更改

保存Rp后,应创建一个新实例


此外,类名、接口和属性应该使用全名,而不是缩写,以便任何接近您的代码的人都能理解正在发生的事情。

我们需要查看更多代码。是否每次创建一个新的IRP实例,或者只是编辑现有的一个实例?考虑使用字典的TryGET方法来避免双字典查找。+ 1击败我。看起来OP使用的是
IRp
的同一个实例。谢谢,我一直在为message类使用同一个实例,并且只更改该类的string属性。如果我为每封邮件创建一个新的对象,它就解决了这个问题,这对我的英语来说是个遗憾。