otherwise - switch case c# windows forms
¿Cuál es un buen sustituto para una gran caja de interruptores? (6)
Como dijo que tiene "objetos" llamados "País", y ha etiquetado su pregunta "C #", parece que tiene dos fuerzas trabajando en su código. Una es que tener que referirse a un mapa, sin embargo, implementado eficientemente, no es tan barato como referirse a una variable miembro . Por otro lado, puede haber algún beneficio en una configuración en la que todos los atributos de un país se encuentren en el mismo lugar que los atributos de otros países (las soluciones orientadas a los mapas abordan esta preocupación). Pero estas fuerzas se pueden reconciliar con algo como esto:
class Country { // Apologies that this sketch is more C++ than C#
public:
Country(string name_, int power_);
private:
string name;
int power;
};
void MakeCountries()
{
countries.Add(new Country("USA", 50));
countries.Add(new Country("Germany", 60));
// ....
}
Tengo objetos llamados País. En algún punto del programa, quiero establecer la potencia de campo de cada objeto.
El poder para cada país es fijo y tengo datos para todos los 196 países aquí en una hoja de papel. Mi código debería verificar, por ejemplo, si el nombre del país es EE. UU. (Y si es así, establecer su potencia a 100) y así sucesivamente.
Sé que puedo hacerlo con una caja de interruptores, pero ¿cuál es la mejor, más bonita y más eficiente forma de hacerlo?
Puede almacenar pares de poder de país en un Dictionary<string, int>
luego obtener el puntaje de un país en particular mediante el uso de indexer:
var points = new Dictionary<string,int>();
// populate the dictionary...
var usa = points["USA"];
Editar: como se sugiere en los comentarios, debe almacenar la información en un archivo externo, por ejemplo, un xml sería una buena opción. De esta forma, no tiene que modificar el código para agregar o eliminar países. Solo necesita almacenarlos en un archivo XML, edítelo cuando lo necesite. Luego, analícelo cuando se inicie su programa, y cargue los valores en Dictionary
. Puede usar LINQ to XML
para eso. Si no lo ha usado antes, hay buenos ejemplos en la documentación para que comiences.
Esta es la pregunta correcta para empezar, pero hay muchas cosas que debes aprender. Mucha gente te ha dado respuestas a la pregunta que hiciste. Voy a ser molestamente Zen y te diré que no hagas la pregunta porque hay un problema más grande que resolver.
En lugar de codificarlo con dificultad, almacene las propiedades relacionadas en una n-tupla también conocida como fila de la base de datos y use un motor de base de datos para administrar la relación entre las dos. Y como está usando C # probablemente sería inteligente aprender a usar LINQ. Pero antes de hacerlo, aprenda un poco sobre la teoría del modelado de datos, porque el modelado de datos es lo que está haciendo.
Mientras que la respuesta de Selmans es correcta y buena, no responde cómo poblar realmente el Diccionario. Aquí es:
var map = new Dictionary<string, int> {
{"USA", 100},
{"Germany", 110}
};
Sin embargo, también puede agregarlo de la siguiente manera:
map.Add("USA", 100);
map.Add("Germany", 110);
Ahora puede acceder al valor (como ya mencionó Semans):
map["USA"] = 50; // set new value for USA
int power = map["USA"]; // get new value
EDITAR: como ya se mencionó en los comentarios y otras respuestas, puede, por supuesto, almacenar los datos dentro de un archivo externo o cualquier otro almacenamiento de datos. Una vez dicho esto, puede inicializar un diccionario vacío y luego completarlo con el método Add mencionado anteriormente para cada registro dentro de ese almacenamiento.
¿Qué tal hacer una variedad de cadenas para almacenar nombres de países en orden ascendente de su poder? Será más fácil de implementar. Luego, el índice de cada país puede representar su poder. Esto es posible, solo si la potencia continúa contando números.
Si no es así, otra manera simple es implementarlos como una lista vinculada. Para que pueda cambiar si lo desea. Una lista con 2 campos; 1para el país y otros para el poder
¿Necesita actualizar sus datos en tiempo de ejecución?
¿Sí? Cargue datos del almacenamiento externo en un diccionario.
¿No? Use un interruptor
Deje que el compilador genere diccionarios y búsquedas basadas en hash para usted. Cuando su perfilador empiece a gritar, explore soluciones alternativas. Por ejemplo, lea la respuesta de " ¿Qué es más rápido, encienda la cadena o elseif en el tipo? ".