Dictionary <string,list <irp =“”>&gt ;,覆盖数据</string,>的问题

时间:2011-02-02 12:09:18

标签: c# list dictionary

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

  public Dictionary<string, List<IRp>> History { get; set; }

Key是nick,List是包含通信历史的集合。

我在存储此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);
        }
    }

问题是我按照这个顺序为同一个Nick(例如Tom)存储消息:

1条消息文本:Hello

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条消息文字:你?

我认为bug必须在SaveRp方法中并以某种方式覆盖/重写

1 个答案:

答案 0 :(得分:7)

问题可能是您正在更新添加到列表中的相同Rp对象。当它被添加到列表中时,会添加对该对象的引用,这意味着如果它被更改,则列表中的数据会发生变化。

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

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