【问题标题】:Problem with Dictionary<string, List<IRp>>, overwriting dataDictionary<string, List<IRp>> 的问题,覆盖数据
【发布时间】:2011-02-02 12:09:17
【问题描述】:

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

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

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

我在 store 上使用了这个 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);
        }
    }

问题是我按这个顺序为同一个尼克(例如汤姆)存储消息:

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 方法中,并且以某种方式覆盖/重写

【问题讨论】:

  • 我们需要查看更多代码。您是每次都创建一个新的 IRp 实例还是只编辑现有的实例?
  • 考虑使用字典的 TryGet 方法,避免双重字典查找。

标签: c# list dictionary


【解决方案1】:

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

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

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

【讨论】:

  • +1 打败我。看起来 OP 正在使用 IRp 的相同实例。
  • 谢谢,我一直使用相同的消息类实例,只更改该类的字符串属性。如果我为每条消息创建新对象,它解决了这个问题,对不起我的英语。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多