2017-02-03 2 views
1

Ich habe drei enum-Typen (enum1, enum2, enum3) char _, deren Werte enthalten kann, und eine Zeichenkette s des Musters "enum1_enum2_enum3".eine Zeichenfolge Parse kombiniert mehrere enums' Werte

Nun, ich möchte s die Zeichenfolge analysieren, um die drei Werte der Enum-Typen zu erhalten.

Gibt es eine effiziente Möglichkeit, das zu tun?

Edit: Ein Beispiel:

enum enum1 {A_1 ,B_1, C_1} 
enum enum2 {A_2, B_2, C_2} 
enum enum3 {A_3, B_3, C_3} 
string s = "A_1_B_2_C_3"; 

nach dem Parsen ich sollte:

enum1 part1 = enum1.A_1; 
enum2 part2 = enum2.B_2; 
enum3 part3 = enum3.C_3; 
+0

Wollen Sie damit sagen, dass die ENUM-Werte durch die '_' begrenzt sind oder dass die tatsächlichen ENUM-Werte könnte in ihnen' _' –

+0

Sind Sie auf dieses Format gebunden? Könnten Sie die Kommatrennung verwenden? Weil Komma Trennung für '[Flags]' enums eingebaut wird ... heck, könnten Sie wahrscheinlich ersetzen (Unterstrich zu Komma) –

+0

Add Enumeration ist eine Enumeration von Integer-Werten .. meinst du, dass Enum-Elemente themselve den Unterstrich enthalten. d. h. Enum_1 = 0, Enum_2 = 1 – Wheels73

Antwort

1

Okay, so die Lösung sein kann:

// your enumeration declaration ... 
private enum enum1 { A_1, B_1, C_1 } 
private enum enum2 { A_2, B_2, C_2 } 
private enum enum3 { A_3, B_3, C_3 } 

// string to process 
private static string s = "A_1_B_2_C_3"; 

// parsing result structure 
private struct ParsingResult 
{ 
    public Type enumType; 
    public object enumValue; 
} 

Nach diesen zu machen, Erstellen Sie einen Platzhalter für die Ergebnisse:

ParsingResult[] results = new ParsingResult[] { 
    new ParsingResult() { enumType = typeof(enum1) }, 
    new ParsingResult() { enumType = typeof(enum2) }, 
    new ParsingResult() { enumType = typeof(enum3) } 
}; 

Dann durch diese Ergebnisse zu verarbeiten String iterieren:

for (int i = 0; i < results.Length; i++) 
{ 
    results[i].enumValue = Enum.GetNames(results[i].enumType).Select(value => 
    { 
     int cIteration = 0; 
     while (cIteration < s.Length && cIteration + value.Length <= s.Length) 
     { 
      string toProcess = s.Substring(cIteration, value.ToString().Length); 
      cIteration += value.ToString().Length + 1; 
      try 
      { 
       object valid = Enum.Parse(results[i].enumType, toProcess); 
       return valid; 
      } 
      catch { } 
     } 
     return null; 
    }) 
    .FirstOrDefault(v => v != null); 
} 

Natürlich ist es string Wert zurückgeben wird und nicht Ihre enum aber dies können Sie mit machen:

results[i].enumValue = Enum.Parse(results[i].enumType, results[i].enumValue.ToString()); 

Und ich denke, es wird dich nicht zu viel Mühe bei der Umsetzung machen.

Später mit:

foreach (ParsingResult value in results) 
{ 
    Console.WriteLine(value.enumValue); 
} 

Beispielausgabe sollte sein:

A_1 
B_2 
C_3 

EDIT:

Ich hatte diese ein wenig zu ändern, da es nicht wie beabsichtigt wurde . Früher, wenn Sie würde:

static string s = "W_4_A_1_B_2_C_3"; 

Output würde ungenau und zeigen Werte wie B_2 und C_3 was bedeutet, es wird die erste enum weglassen. Nach der einfachen Bearbeitung werden nur gültige Werte zurückgegeben.

+0

Vielen Dank, es funktioniert wird :) – Lio