嗨,我将聊天对话存储在以下属性类型中:

  public Dictionary<string, List<IRp>> History { get; set; }
Key 是 nick,List 是包含通信历史的集合。
我在存储时使用这个 SaveRp 方法,IRp 是实现消息类的接口(interface)。
    public void SaveRp(IRp rp)
    {
        if (!History.ContainsKey(rp.Nick))
        {
            History.Add(rp.Nick, new List<IRp> { rp });
        }
        else
        {
            History[rp.Nick].Add(rp);
        }
    }
问题是我按此顺序为同一个尼克(例如汤姆)存储消息:
1 条消息:你好
2 消息文本:如何
3 消息文本:是
4 短信内容:你?
问题是,如果我使用此方法加载此昵称的历史记录:
    public IList<IRp> GetRps(string nick)
    {
        var result=new List<IRp>();
        if (History.ContainsKey(nick))
        {
           result= History[nick];
        }
        return result;
    }
我明白了:
1条短信:你?
2 短信内容:你?
3 留言内容:你?
4 短信内容:你?
我认为错误必须在 SaveRp 方法中,并且以某种方式覆盖/重写

最佳答案

问题很可能是您正在更新添加到列表中的同一个 Rp 对象。当它被添加到列表中时,会添加一个对对象的引用,这意味着如果它被更改,那么列表中的数据也会更改。

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

此外,类名、接口(interface)和属性应该使用全名,而不是缩写,以允许任何接近您的代码的人了解正在发生的事情。

关于c# - Dictionary<string, List<IRp>> 的问题,覆盖数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4874295/

10-11 22:30
查看更多