2014-03-25 44 views
3

我只想了解应该使用哪一个。C#字典添加与联盟

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

方法签名是像下面

public void OnMessage(Message[] messages) 

我应该每封邮件添加到现有的信息数据。消息存储在会话内存中。

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

是最好的消息由一个如下

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); 
+0

这些方法会给你不同的结果。 'Add'会为重复的条目抛出异常,'Union'只是第一个。 – MarcinJuraszek

回答

2

如果添加到existingMessages一个你只是想发送两者的组合,不需要修改任何一个的结构。 LINQ类型的方法在这里很好,因为它生成一个代理,它代表最终枚举一个集合,然后代表另一个

虽然因为这些是词典,所以将它们结合起来的想法有点困难。如果有重复的密钥怎么办?你如何处理 - 哪一个优先?

如果你打算产生一个KeyValuePair<string, Message>的序列,那么重复键不会引起任何问题。但是如果是这样的话,请记住Union()可能不会完全符合您的预期 - 它只会追加第一组中找不到的元素。如果你是联盟 - 荷兰国际集团的KeyValuePair<T,V>序列它将使用ValueType.Equals作为相等比较,它具有以下行为:

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

您可能想用Concat代替。