2010-07-17 5 views
2

J'ai deux dictionnaires complexes sous formefusion de dictionnaires complexes en C# .net en écrivant une fonction récursive générique

Dictionary<string, Dictionary<string, Dictionary<string, List<string>>>> 

Comme vous le voyez, j'AVONS dictionnaires internes. Je veux écrire une fonction récursive générique qui peut fusionner deux dictionnaires complexes de cette forme (ou n'importe quelle autre forme complexe de dictionnaires), en s'appelant en passant les dictionnaires intérieurs (qui sont de structure différente). Cette question a aussi une autre partie. Comment ajouter un dictionnaire à un autre sans boucler?

Un peu plus d'explications

Ce dictionnaire contient la liste des messages envoyés par un UTILISATEUR bavardant dans une session CHAT GROUPE spécifique à un utilisateur spécifique (lire la phrase et interpréter le dictionnaire de la fin). J'ai donc deux dictionnaires de cette forme. Dès que j'envoie le message à un utilisateur, je l'enlève du dictionnaire. Mais je veux avoir l'histoire des messages. Donc avant de le supprimer je fais juste une copie en l'ajoutant à un autre dic qui contient tous les messages, dans toutes les sessions de chat, de tous les utilisateurs, à tous les utilisateurs jusqu'à maintenant!

Remarque: Je ne suis pas béni pour utiliser LINQ.

Merci

VSN

+0

Pouvez-vous donner un exemple avec quelques entrées et résultats attendus de votre fonction? Je ne suis pas sûr de ce que votre fonction est censée faire en dehors d'être récursive ... – dtb

+0

Wow, je me demande ce que ce type de données représente :-) –

+0

Post mis à jour. Vérifiez-le. – NLV

Répondre

2

Si j'ose être si audacieux, l'utilisation de dictionnaires de cette manière rend le code extrêmement inaccessible. À mon humble avis, la structure de classe suivante, ou similaire, serait beaucoup, beaucoup plus facile à comprendre et à travailler.

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;} 
} 

Je sais que cela ne répond pas à votre demande spécifique, mais tente de répondre à l'essence de la demande - être capable de travailler avec des utilisateurs, des sessions de chat et messages facilement.

Amusez-vous!

+0

Tout à fait raison. Accepté. Mais je suis un long chemin pour changer le code maintenant :( – NLV

+0

Ok. Si je crée des classes personnalisées comme ça, comment puis-je facilement rechercher un utilisateur ou un message ou un ID de groupe de discussion? Ce sera difficile. en boucle?Juste parce que je l'ai dans le format du dictionnaire, je suis capable de faire usage de toutes les fonctions utiles du dictionnaire. – NLV

+0

J'ai modifié ma réponse pour gérer la recherche par utilisateur ou par session. J'espère que ça aide ... (oh, et le mélange corrigé de C#/VB * blush *) – Will

1

Runtime envoi en fonction du type doit utiliser la réflexion, ce qui est très salissant quand génériques entrent en jeu. Je recommande "tricher" et en utilisant IDictionary à la place.

Ainsi, votre déclaration de méthode ressemblerait à quelque chose comme ceci:

// Merges b into a 
void Merge<T>(T a, T b) where T : IDictionary 

Ensuite, itérer chaque entrée de b. Si la clé n'existe pas dans a, ajoutez le kvp à a et continuez l'itération. Si la valeur is IDictionary, passez la valeur a et la valeur b à Merge récursivement. Sinon, si is ICollection, fusionner ses valeurs dans la collection dans a. Sinon, erreur.

Questions connexes