Vous devez utiliser un enum
pour les matériaux à la place de la chaîne et vous pouvez utiliser un Dictionary
pour tenir correspondant combinaisons de sons. Vous pouvez sauter plusieurs if
états et sélectionnez l'objet correspondant pour chaque matériau automatiquement à l'aide de l' Dictionary
. Par exemple:
[Flags]
enum Material
{
Wood=1,
Iron=2,
Glass=4
//...
}
Dictionary<Material,SoundObject> sounds = new Dictionary<Material,SoundObject>();
sounds.add(Material.Wood,woodSound);
sounds.add(Material.Iron,ironSound);
sounds.add(Material.Wood | Material.Iron,woodAndIronSound);
// And play corresponding sound directly without any if statement.
sounds[object.Material].Play();
sounds[matA | matB].Play();
Avantages de Performance:
Vous pouvez également améliorer les performances par l'utilisation de cette approche. car certainement comparaison des entiers de valeurs Enum ou des codes de hachage serait plus facile et plus rapide que la comparaison de chaînes de caractères. Et à propos de dictionnaire VS plusieurs if-else
des déclarations, des séries de if/else if
états exécute de façon linéaire; de sorte que son rendement très dépend du nombre de si les déclarations et comparateur d'égalité de l'objet; tout en Dictionary
est basé sur une table de hachage. Il utilise un index-collection optimisée pour stocker des valeurs, ce qui a fait de la constante de temps d'accès. Cela signifie souvent, il n'est pas question de la façon dont beaucoup de touches sont dans le dictionnaire, vous aurez accès à valeurs dans un temps constant et dans la plupart des scénarios, il est très rapide de plusieurs instructions if.
Comparaison des performances:
Nous allons comparer les performances des deux approche dans cet exemple:
//If you want to try, just copy the code and see the result.
static Dictionary<char, short> myHashTable = Enumerable.Range((short)'A', (short)'z').ToDictionary((ch) => (char)ch, (sh) => (short)sh);
static void Main(string[] args)
{
System.Diagnostics.Stopwatch SW = new System.Diagnostics.Stopwatch();
short temp = 0;
SW.Start();
for(int i=0;i<10000000;i++)
temp = getValue('z');
SW.Stop();
Console.WriteLine(SW.ElapsedMilliseconds );
SW.Reset();
SW.Start();
for(int i =0;i<10000000;i++)
temp = myHashTable['a'];
SW.Stop();
Console.WriteLine(SW.ElapsedMilliseconds);
}
static short getValue(char input)
{
if (input == 'a')
return (short)'a';
else if (input == 'b')
return (short)'b';
else if (input == 'c')
return (short)'c';
else if (input == 'd')
return (short)'d';
else if (input == 'e')
return (short)'e';
else if (input == 'f')
return (short)'f';
else if (input == 'g')
return (short)'g';
else if (input == 'h')
return (short)'h';
else if (input == 'i')
return (short)'i';
else if (input == 'j')
return (short)'j';
else if (input == 'k')
return (short)'k';
else if (input == 'l')
return (short)'l';
else if (input == 'm')
return (short)'m';
else if (input == 'n')
return (short)'n';
else if (input == 'o')
return (short)'o';
else if (input == 'p')
return (short)'p';
else if (input == 'q')
return (short)'q';
else if (input == 'r')
return (short)'r';
else if (input == 's')
return (short)'s';
else if (input == 't')
return (short)'t';
else if (input == 'u')
return (short)'u';
else if (input == 'v')
return (short)'v';
else if (input == 'w')
return (short)'w';
else if (input == 'x')
return (short)'x';
else if (input == 'y')
return (short)'y';
else if (input == 'z')
return (short)'z';
return 0;
}
résultat:
if
des énoncés à 26 éléments| dictionnaire avec 122 articles.
593 254
256 579
252 572
570 246
587 248
574 291
576 246
685 265
599 282
723 338
ce qui indique dictionnaire est plus de 2 fois plus rapide que l' if/else if
des déclarations.