2010-12-21 12 views
14

Hola tengo esta enumeración Actualmenteasignar múltiples valores es posible enumerar los elementos

[Serializable] 
public enum Country 
{ 
    US  = 1, 
    Canada = 2, 
} 

Cuando Normalmente el número entero de la base de datos que convertirlo a la enumeración utilizando

(Country) Convert.ToInt32("1") 

ahora tengo 2 sub regiones en EE. UU. y Canadá, 1 & 2 para EE. UU. y 3 & 4 para canadá. Entonces cuando lo hago

(Country) Convert.ToInt32("1") o (Country) Convert.ToInt32("2") debo obtener la enumeración para ser EE. UU. y para 3 & 4 Canadá. ¿Cómo implemento esto?

[Serializable] 
public enum Country 
{ 
    US  = 1,2 
    Canada = 3,4 
} 

Algo así. Esto probablemente no es correcto, solo para darte una Idea.

Respuesta

3

Ah Acabo de utilizar una función en lugar de encasillar directamente. Mucho más fácil que implementar algo completamente diferente. Ya tengo mucho código ejecutándose en esto, así que no puedo cambiarlo mucho, pero esto es lo que hice.

public Country GetCountryByTaxID(int taxID) 
     { 
      if (taxID == 3 || taxID == 4) 
      { 
       return Country.USA; 
      } 
      else 
      { 
       return Country.Canada; 
      } 
     } 
9

Usted tendrá que hacer algo como esto:

class Region 
{ 
    static readonly RegionMap = new Dictionary<int,string> 
    { 
     { 1, "US" }, 
     { 2, "US" }, 
     { 3, "Canada" } 
     { 4, "Canada" } 
    } 

    public static string GetRegion(int code) 
    { 
     string name; 
     if (!RegionMap.TryGetValue(code, out name) 
     { 
      // Error handling here 
     } 
     return name; 
    } 
} 

A continuación, busque la cadena en función del valor de la base de datos:

string region = Region.GetRegion(dbVal); 
+0

Encontré esto buscando algo más. Esta es la respuesta más sensata para mí. Por supuesto, esta pregunta se hizo hace 5½ años. – MarkMYoung

8

Esto no es posible. Tendría que usar valores separados entonces. Si los nombres son iguales, es decir.

[Serializable] 
[Flags] 
public enum Country 
{ 
    US  = 1, 
    Canada = 2, 
    Northern = 4, 
    Southern = 8 
} 

Puede hacer esto: Countries = Country.US | Country.Northern. Si no es así, debe encontrar otra forma, posible otra propiedad o incluso mejor, una clase Location.

5

Tal vez algo como esto?

static Country ConvertRegionToCountry(string region) 
{ 
    switch (region) 
    { 
     case "1": 
     case "2": 
      return Country.US; 

     case "3": 
     case "4": 
      return Country.Canada; 
    } 
} 
13

Un enum no puede ser la construcción de la derecha para modelar este tipo de problema.

Sugeriría crear una clase para representar la información del país, y proporcionar métodos para convertir a y desde representaciones numéricas. Con problemas como este, también debe decidir qué valor de codificación usará al convertir una instancia de país seleccionada en un valor numérico.

El modelo objeto de enumeración puede ser el punto de partida útil para modelar este tipo de situación:

public sealed class Country 
{ 
    // initialize appropriately in the constructor... 
    private readonly int[] m_Values; 
    private readonly string m_Name; 

    // make the constructor private so that only this class can set up instances 
    private Country(string name, int[] codes) { ... } 

    public static Country US = new Country("United States", new[]{ 1,2 }); 
    public static Country Canada = new Country("Canada", new[] {3,4}); 

    public static Country FromCode(int code) { ... } 
    public override string ToString() { return m_Name; } 
    // ... etc... 
} 

Basado en su ejemplo, también se debe considerar si es necesario modelo de país sub-regiones como de primera clase entidades, en lugar de simplemente doblarlas en los detalles de implementación de su enumeración en el País. Si usted debe hacer esto o no, depende de sus requisitos y casos de uso, por lo que solo usted puede tomar una decisión adecuada al respecto.

+0

Gracias por la Idea, la estoy implementando en otra situación en el mismo proyecto. Cambiar el existente es realmente doloroso, así que puse la solución rápida. Pero esto es mucho mejor. – tHeSiD

0

Esta costuras como un problema conjunto para mí, donde 1 & 2 están en los EE.UU. set y 3 & 4 están en el conjunto de Canadá.Hay un código establecido en code project que creo que modela mejor el problema.

3
public Country GetCountry(int a) 
     { 
      if (a == 1 || a == 2) 
      { 
       return Country.USA; 
      } 
      else if (a == 4|| a == 3) 
      { 
       return Country.Canada; 
      } 
     } 
0

con la respuesta de DTB (y los equivalentes if sugerencias), acabo de implementar una versión 'anulado' de System.Convert del espacio de nombres de mi solicitud:

public static class Convert 
{ 
    public static object ChangeType 
     (object value, Type conversionType, IFormatProvider provider) 
    { 
     int country; 
     if (conversionType == typeof(Country) 
      && int.TryParse(value.ToString(), out country)) 
     { 
      switch (country) 
      { 
       case 1: 
       case 2: 
        return Country.US; 
       case 3: 
       case 4: 
        return Country.Canada; 
      } 
     } 

     // For most cases, including any country unmatched above... 
     return System.Convert.ChangeType(value, conversionType, provider); 
    } 
} 

métodos originales de la clase mscorlib.dll Convert ahora debe tener el prefijo "System.", por supuesto, ¡cualquier refinamiento sería bienvenido!

Cuestiones relacionadas