通过编写泛型递归函数合并C#.net中的复杂词典

通过编写泛型递归函数合并C#.net中的复杂词典,c#,generics,dictionary,recursion,merge,C#,Generics,Dictionary,Recursion,Merge,我有两本复杂的字典 Dictionary<string, Dictionary<string, Dictionary<string, List<string>>>> 字典 如你所见,我有内部字典。我想编写一个通用递归函数,它可以通过调用自身传递内部字典(结构不同)来合并这种形式的两个复杂字典(或任何其他复杂形式的字典)。这个问题还有另外一部分。如何在不循环的情况下将一个字典附加到另一个字典 再解释一下 此词典保存在特定群组聊天会话中聊天的用户发

我有两本复杂的字典

Dictionary<string, Dictionary<string, Dictionary<string, List<string>>>>
字典
如你所见,我有内部字典。我想编写一个通用递归函数,它可以通过调用自身传递内部字典(结构不同)来合并这种形式的两个复杂字典(或任何其他复杂形式的字典)。这个问题还有另外一部分。如何在不循环的情况下将一个字典附加到另一个字典

再解释一下

此词典保存在特定群组聊天会话中聊天的用户发送给特定用户的消息列表(阅读句子并从头到尾解释词典)。我有两本这种形式的字典。一旦我将消息发送给用户,我就会将其从字典中删除。但我想知道信息的历史。因此,在删除它之前,我只需将它添加到另一个dic中,该dic包含所有聊天会话中的所有消息,从所有用户到目前为止的所有用户

注意:我不适合使用LINQ

多谢各位


NLV

基于类型的运行时调度必须使用反射,这在泛型发挥作用时非常混乱。我建议“作弊”并改用
IDictionary

因此,您的方法声明如下所示:

// Merges b into a
void Merge<T>(T a, T b) where T : IDictionary
//将b合并到a中
无效合并(TA,TB),其中T:IDictionary

然后,遍历
b
的每个条目。如果
a
中不存在该键,则将kvp添加到
a
并继续迭代。如果值
是IDictionary
,则将
a
值和
b
值递归传递给
Merge
。否则,如果它
是ICollection
,则将其值合并到
a
中的集合中。否则,就会出错。

如果我敢这么大胆的话,以这种方式使用字典会导致极不可维护的代码

IMHO,下面的类结构或类似结构将更容易理解和使用

public class User {
  public string Name {get;set;}

  // Sessions this user is participating in
  // (when you add to Session, add here too - Using a method to add both at same would be safest)
  public List<Session> Sessions {get;set;}

  // etc
}

public class Message {
  public User Sender {get;set;}
  public string Text {get;set;}
  // etc
}

public class Session {
  public string Title {get;set;}
  public List<User> Participants {get;set;}
  public List<Message> SentMessages {get;set;}
  public List<Message> UnsentMessages {get;set;}
}

public class ChatSystem {
   // All Users - Indexed by Name
   public Dictionary<string, User> Users {get; set;}

   // All Sessions - Indexed by Title
   public Dictionary<string, Session> Sessions {get; set;}
}
公共类用户{
公共字符串名称{get;set;}
//此用户正在参与的会话
//(当您添加到会话时,也可以在此处添加-使用方法同时添加两者将是最安全的)
公共列表会话{get;set;}
//等
}
公共类消息{
公共用户发送方{get;set;}
公共字符串文本{get;set;}
//等
}
公开课{
公共字符串标题{get;set;}
公共列表参与者{get;set;}
公共列表消息{get;set;}
公共列表未发送消息{get;set;}
}
公共类聊天系统{
//所有用户-按名称索引
公共字典用户{get;set;}
//所有会话-按标题索引
公共字典会话{get;set;}
}
我知道这并不是针对你的特定请求,而是试图解决请求的本质——能够轻松地与用户、聊天会话和消息打交道


玩得开心

你能举一个例子说明你的函数的输入和预期结果吗?我不确定你的函数除了递归之外应该做什么…哇,我想知道这个数据类型代表什么:-)绝对正确。认可的。但我现在要改变代码还有很长的路要走:(好的。如果我创建像这样的自定义类,我如何能够轻松搜索用户、消息或群聊id?这将很困难。我可以不循环地搜索吗?仅仅因为我有字典格式,我就能够利用所有有用的字典功能。我已经编辑了我的回复以处理用户或会话的搜索。希望它能有所帮助。。。(哦,纠正了C#/VB腮红的混合)