2010-05-27 21 views
1

Qu'est-ce qu'une collection/un bon conteneur à utiliser pour stocker essentiellement le contenu d'une instruction de commutateur avec plusieurs situations de simulation? Je suppose, une façon plus précise est, ce qui est une bonne solution C# pour une recherche "many-keys-one-value"? J'ai vérifié à travers l'espace de noms System.Collections et ses espaces de noms associés, mais n'ai rien trouvé qui se soit particulièrement prêté à many-keys-one-value.Conversion d'une instruction de commutateur codée en dur en une recherche de plusieurs clés à charge unique chargée dynamiquement

Récemment, je me suis écrit un petit programme de console pour construire et valider les fichiers XML dont j'ai besoin pour mon application web, pour éviter les erreurs qui se produisent lors de l'écriture manuelle. Mais pour la version initiale, j'ai codé en dur un certain nombre d'éléments qui sont légèrement modifiables - en particulier quelques dictionnaires pour la validation et un grand commutateur-déclaration qui a un ensemble considérable d'options fallthrough. Bien que cela puisse fonctionner pendant plusieurs mois, il peut s'avérer nécessaire de mettre à jour ces éléments codés en dur, ce qui nécessiterait l'édition du fichier source. Afin d'éviter cela, j'ai décidé de stocker les informations du dictionnaire et de l'instruction switch dans un fichier XML (qui a finalement évolué, dans une tendance horriblement récursive, en écrivant un programme pour construire et valider ces fichiers XML pour moi). Maintenant, en stockant cela dans un fichier, quand je récupère les données, je ne peux pas simplement reconstruire l'instruction switch comme je peux les dictionnaires. J'ai donc simplement besoin de simuler l'effet d'une instruction switch, ce qui signifie que j'ai besoin de plusieurs "clés" pour faire référence à la même "valeur".


Exemple d'extrait de l'instruction switch. Cette méthode va convertir les entrées de valeurs spéciales en un ID correspondant, principalement pour économiser de l'espace mémoire humain en essayant de mémoriser les valeurs. Fondamentalement, comme illustré, j'aimerais un conteneur pour stocker les plusieurs clés qui sortent toutes une seule valeur.

private static string DiscernRegistrationId(string str) 
{ 
    string retVal = str; 
    switch (str.ToLowerKey()) //shortcut extension for str.Replace(" ","").Replace(".","").ToLowerInvariant() 
    { 
     case "computerpackage": 
     case "comppackage": 
     case "cpackage": 
     case "computerpkg": 
     case "comppkg": 
     case "cpkg": 
      retVal = "0x0100C73692D109C741A1B8846141B47519C8"; 
      break; 
     case "mobilepackage": 
     case "mobpackage": 
     case "mpackage": 
     case "mobilepkg": 
     case "mobpkg": 
     case "mpkg": 
      retVal = "0x010081F753F0A4A5412CB6A8E9F8CD193F58"; 
      break; 
     //More cases follow 
    } 
    return retVal; 
} 
+0

Si vous cherchez à valider la * structure * (et dans une certaine mesure le * contenu *) d'un fichier XML, alors vous pouvez utiliser un xsd - cela peut vous éviter d'écrire une partie de votre énorme instruction switch. – slugster

+0

@slugster C'est principalement la validation des valeurs possibles pour certains éléments. J'ai inclus un petit extrait de la déclaration switch pour illustrer ce que je cherche essentiellement. Il n'a pas été nécessaire de valider la structure du fichier jusqu'à présent, bien que la construction par programme du fichier aide certainement à empêcher que cela se produise à l'avenir. –

Répondre

1

Je pense que votre meilleure option est de coller avec l'une des classes IDictionary<> et de simplement dupliquer les valeurs. Je recommande réellement un SortedDictionary<> dans ce cas, car il stocke les éléments dans l'ordre par la clé. Cela serait utile si vous deviez imprimer les clés de manière à donner le même aspect visuel que l'instruction switch.

Le stockage des valeurs plusieurs fois ne devrait pas être un problème pour vous puisque ce sont des chaînes qui sont des types de référence. Bien sûr, vous aurez des références en double à la même chaîne, mais ce n'est pas comme si vous dupliquiez le contenu de la chaîne entière ou quoi que ce soit.

Une autre chose à souligner est que je crois que le compilateur convertit réellement cette déclaration de commutateur en hashtable dans les coulisses. Cela signifie qu'il utilise probablement la même stratégie que je viens de recommander. Démonter et jeter un coup d'oeil.

+0

L'ordre de tri des éléments de 'SortedDictionary ' peut ne pas être le même que celui de l'instruction' switch', qui nécessiterait une commande par valeur. Mais cela fonctionnerait sur certains types d'entrée (comme celui de la question). – svick

+0

@svick: Bon point. –

+0

Ajoutons @svick juste pour faire clignoter vos deux enveloppes. Est-ce que vous deux dites essentiellement qu'il n'y a pas de solution à plusieurs clés en C#? Si c'est le cas, je vais me contenter d'un dictionnaire. Ce n'est pas que le stockage répété est une préoccupation ... J'espérais simplement qu'il existait une solution à plusieurs clés et à valeur unique. –

3

J'utiliser Dictionary<string, string> ordinaire et le point tous les cas de chutes par le même objet string.

+0

Selon http://dotnetperls.com/string-switch, l'instruction switch sera compilée dans un Dictionary . –

+0

@ paper1337: Ce n'est pas surprenant, cependant, je soupçonne qu'il y a des cas où il choisit de ne pas utiliser cette stratégie (peut-être si le nombre de déclarations de cas est faible). Mais, oui, cette optimisation a été autour depuis v1.0 du compilateur. –