2009-03-13 3 views
1

Je souhaite créer une classe (statique?) Qui mappe simplement un nom sur une valeur (1 à 1). Quel est un moyen propre de faire quelque chose comme ceci:Création d'une classe de mappeur de valeur de nom simple en C#

public static class FieldMapper 
{ 
    public static GetValue(string Name) 
    { 
    if (Name == "abc") 
     return "Value1"; 

    if (Name == "def") 
     return "Value2"; 
    } 
} 

Je pourrais avoir un bloc de pensée aujourd'hui. Je ne peux pas penser à une solution propre pour un problème simple comme ça :(

Edit:. Toutes les valeurs sont connues au moment de la compilation (Il n'y a pas d'unicité - clés différentes peuvent mapper même valeur) Je ne devrais « t créerez une structure de données qui ajoute des valeurs lors de l'exécution. de plus, je voudrais éviter d'utiliser un fichier XML

Répondre

0

Si vous voulez la co Lection à créer au moment de la compilation au lieu du démarrage, vous pouvez simplement utiliser un commutateur.

Si le commutateur contient plus de quelques éléments (cinq IIRC), il est implémenté en utilisant une recherche de hachage, donc c'est très rapide même si vous y mettez beaucoup de cas. (C'est-à-dire que le temps d'accès est le même pour tous les cas.)

public static class FieldMapper { 

    public static string GetValue(string name) { 
     switch (name) { 
     case "abc": return "Value1"; 
     case "def": return "Value2"; 
     } 
     throw new ArgumentException("Unknown name.", "name"); 
    } 
} 
14

Sonne comme un emploi pour un dictionnaire.

Dictionary<string, string> values = new Dictionary<string, string>(); 
values.Add("abc", "Value1"); 
values.Add("def", "Value2"); 
Console.WriteLine(values["abc"]); // Prints "Value1" 
+0

Une classe qui hérite de IDictionary? Toutes ces valeurs sont connues au moment de la compilation. – DotnetDude

+0

Dans .Net 2 ou supérieur, System.Collections.Generic.Dictionary

0

Si vous parlez de valeurs connues au moment de la compilation, vous pouvez essayer de les stocker en tant que ressources. Quelque chose comme ceci:

//Name Spaces Required 
using System.Resources; 
using System.Reflection; 

// Create the resource manager. 
Assembly assembly = this.GetType().Assembly; 

//ResFile.Strings -> <Namespace>.<ResourceFileName i.e. Strings.resx> 
resman = new ResourceManager("StringResources.Strings", assembly); 

// Load the value of string value for Client 
strClientName = resman.GetString("Client"); 

(Stolen de here)

+0

aka Dictionnaire peut-être? – Svish

+0

Si vous votez en bas, laissez-moi savoir pourquoi - si mes réponses sont fausses, je peux les corriger ou les supprimer. –

+0

Je ne ai pas, mais une liste n'est pas un hashlookup, il ne résout pas le problème – annakata

0

Je pense qu'un dictionnaire serait mieux mais, si vous allez le faire dans le code:

public static class FieldMapper 
{ 
    public static GetValue(string Name) 
    {  
     switch (Name) 
     { 
     case "abc": 
     return Value1; 
     } 
    } 
} 
1

Si vous pouvez pré -chargez vos articles dans un dictionnaire, ce qui aiderait considérablement:

IDictionary<string, string> myValues = new Dictionary<string, string>(3) 
{ 
     {"abc", "Value1"}, 
     {"def", "Value2"}, 
     {"ghi", "Value3"} 
}; 

var mySearchString = "abc"; 
return myValues.Keys.Contains("abc") ? myValues[ mySearchString ] : string.Empty; 
+0

Est-il nécessaire de spécifier le nombre d'éléments dans le dictionnaire ou est-ce facultatif? Bien que je connaisse tous les éléments au moment de la conception, il y aura plusieurs développeurs qui mettront à jour le fichier et ils auront tendance à incrémenter le nombre chaque fois qu'ils en ajouteront un nouveau – DotnetDude

+0

Les dictionnaires gèrent leur propre capacité dynamiquement. –

+0

Robert a raison. Il y a plusieurs surcharges dans le dictionnaire (et d'autres types de collection similaires), dont l'une vous permet de définir le nombre d'éléments à l'avance si vous le connaissez. Cette surcharge est disponible car si vous connaissez ce nombre, cela rendra le dictionnaire beaucoup plus efficace. – Boydski

Questions connexes