C#Dictionary添加vs Union

时间:2014-03-25 18:32:57

标签: c# data-structures

我只想了解应该使用哪一个。

我有一个MessageListener,其中我有时会只获得一个项目,有时我可能会获得多个项目(最多可以发送200条消息)。

方法签名如下所示

   public void OnMessage(Message[] messages)

我应该将每条消息添加到现有的消息数据中。消息存储在会话存储器中。

  Dictionary<String,Message> existingMessages = (Dictionary<String,Message>) 
                                        Session.GetSessionData("key");

最好将Message一个一个地添加到现有的消息中,如下所示

foreach(Message msg in messages)
{
  existingMessages.Add(msg);
}
Session.AddData("key",existingMessages);

创建地图并与现有地图合并是否更好

Dictionary<String,Message> newMap = new Dictionary<String,Message>(); 
foreach(Message msg in messages)
{
  newMap.Add(msg);
}
//combine with existing data
existingMessages.union(newMap);
//put the data back in session memory
Session.AddData("key",existingMessages);

1 个答案:

答案 0 :(得分:2)

如果您只想发送两者的组合,则无需修改其中任何一种的结构。这里LINQ类型的方法很好,因为它生成一个代理,代表一个集合的最终枚举,然后是另一个

虽然因为这些都是字典,但将它们组合起来的想法有点困难。如果有重复键怎么办?你如何处理 - 谁优先?

如果您打算生成一系列KeyValuePair<string, Message>,则重复的密钥不会导致任何问题。但如果情况确实如此,请记住Union()可能没有达到您预期的效果 - 它只会追加第一组中找不到的元素。如果要联合KeyValuePair<T,V>序列,它将使用ValueType.Equals作为相等比较器,它具有以下行为:

  

如果当前实例和obj的所有字段都不是引用类型,则Equals方法会对内存中的两个对象执行逐字节比较。否则,它使用反射来比较obj和此实例的相应字段。

您可能希望改为使用Concat