2010-12-21 46 views
14

Hallo Ich habe dieses Enum derzeitAssign mehrere Werte Elemente ENUM

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

Wenn ich in der Regel die ganze Zahl aus der Datenbank bekomme ich es in die Enum umwandeln mit

(Country) Convert.ToInt32("1") 

ich jetzt 2 sub haben Regionen in den USA und Kanada, 1 & 2 für die USA und 3 & 4 für Kanada. Wenn ich also

(Country) Convert.ToInt32("1") oder (Country) Convert.ToInt32("2") mache, sollte ich die Enum zu US bekommen. und für 3 & 4 Kanada. Wie implementiere ich das?

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

So etwas Ähnliches. Dies ist wahrscheinlich nicht richtig, aber nur um Ihnen eine Idee zu geben.

Antwort

3

Ah Ich habe gerade eine Funktion statt direkt Typumwandlung verwendet. Viel einfacher als etwas ganz anderes zu implementieren. Ich habe bereits viel Code auf diesem laufen so kann es nicht viel ändern, aber hier ist was ich getan habe.

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

Sie werden so etwas zu tun haben:

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; 
    } 
} 

dann die Zeichenfolge nachschlagen basierend auf dem Wert aus der Datenbank:

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

Ich fand dies auf der Suche nach etwas anderem. Das ist die vernünftigste Antwort für mich. Natürlich wurde diese Frage vor 5½ Jahren gestellt! – MarkMYoung

8

Das ist nicht möglich. Sie müssten dann separate Werte verwenden. Wenn die Namen gleich sind, d.

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

Sie könnten dies tun: Countries = Country.US | Country.Northern. Wenn nicht, müssen Sie einen anderen Weg finden, möglicherweise eine andere Eigenschaft oder noch besser, eine Location Klasse.

5

Vielleicht so etwas?

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

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

Ein enum möglicherweise nicht das richtige Konstrukt sein, um diese Art von Problem zu modellieren.

Ich würde vorschlagen, eine Klasse zu erstellen, um Länderinformationen darzustellen, und bieten Methoden die Konvertierung von und von numerischen Darstellungen. Bei Problemen wie diesem müssen Sie auch entscheiden, welchen Codierungswert Sie verwenden, wenn Sie eine ausgewählte Country-Instanz in einen numerischen Wert konvertieren.

Das Objektmuster Enum kann für die Modellierung diese Art von Situation hilfreich Ausgangspunkt:

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... 
} 

Basierend auf Ihrem Beispiel, sollten Sie auch prüfen, ob Sie Land Subregionen als erste Klasse modellieren müssen Entitäten, anstatt sie einfach in die Implementierungsdetails Ihrer Länderaufzählung einzufügen. Ob Sie dies tun sollten oder nicht, hängt von Ihren Anforderungen und Anwendungsfällen ab, sodass nur Sie eine angemessene Entscheidung treffen können.

+0

Danke für die Idee, ich implementiere es in einer anderen Situation im selben Projekt. Das bestehende zu ändern ist wirklich schmerzhaft, also habe ich die schnelle Lösung festgehalten. Aber das ist viel besser. – tHeSiD

0

Diese Nähte wie ein Satz Problem für mich, wo 1 & 2 im Satz sind uns und 3 & 4 sind in der Menge Kanada.Es gibt einige Set-Code auf code project, die ich denke, modelliert das Problem besser.

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

Zusätzlich zu dtb Antwort (und die äquivalenten if Vorschläge), I implementiert nur ein 'außer Kraft gesetzt' -Version von System.Convert in Namespace meine Anwendung:

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); 
    } 
} 

Original-Methoden der mscorlib.dll Convert Klasse muss jetzt natürlich mit "" vorangestellt werden, damit alle Feinheiten willkommen sind!