2017-03-15 4 views
0

In meinem Code, ich habe seit einigen Tagen der Woche eine Flags Enum bekam, wie folgt:XElement mit Flags Enum

[Flags] 
public enum DaysOfWeek   // enumeration for days of week 
{ 
    Sunday = 0x0000001, 
    Saturday = 0x0000010, 
    Friday = 0x0000100, 
    Thursday = 0x0001000, 
    Wednesday = 0x0010000, 
    Tuesday = 0x0100000, 
    Monday = 0x1000000, 
    MondayToFriday = Monday | Tuesday | Wednesday | Thursday | Friday, 
    MondayToSaturday = MondayToFriday | Saturday, 
    NotSaturday = MondayToFriday | Sunday, 
    Weekend = Saturday | Sunday, 
    MondayToSunday = MondayToFriday | Weekend, 
    HolidaysOnly = ~MondayToSunday, 
} 

Und ich dies wie im folgenden vereinfachten Beispiel zur Ausgabe von XML:

List<DaysOfWeek> profiles = new List<DaysOfWeek>(); 
profiles.Add(DaysOfWeek.MondayToFriday); 
profiles.Add(DaysOfWeek.MondayToSaturday); 
profiles.Add(DaysOfWeek.Monday | DaysOfWeek.Tuesday); 

XElement xml = new XElement("Profiles", 
       from DaysOfWeek pf in profiles 
       select new XElement("Profile",pf.ToString()) 
       ); 
Console.WriteLine(xml); 

das gibt mir die Ausgabe:

<Profiles> 
    <Profile>MondayToFriday</Profile> 
    <Profile>MondayToSaturday</Profile> 
    <Profile>Tuesday, Monday</Profile> 
</Profiles> 

Aber was ich will, ist:

Ich schätze, dass das Format meines XElement erweitert werden muss, damit ich leere Elemente für die Wochentage bekomme, aber wenn ich dies tue, dann löst das Element "Tuesday, Monday" eine Ausnahme aus, weil ich kann Verwenden Sie kein Komma (oder Leerzeichen) als Teil eines Elementnamens.

Aber

a) Wenn nicht einer der vordefinierten Gruppen von Tagen mit, ich brauche die Elemente in einer bestimmten Reihenfolge (Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag) zu schreiben, die gegeben ist durch das Schema (siehe c unten). Ich habe es mir schwerer gemacht, weil ich sie umgekehrt definiert habe, mit Montag als High-Bit, aber das lag daran, dass das ältere Datenformat, mit dem ich zuerst zu tun hatte, die Tage als Flags (1/0) in einem String anzeigt diese Reihenfolge z Montag und Dienstag sind "1100000" (Montag links, Sonntag rechts);

b) Ich möchte in der Lage sein, die entsprechenden Elemente auszugeben, ohne alles einzeln testen zu müssen (obwohl ich denke, dass ich es tun muss, wenn ich muss); und

c) Das XML-Ausgabeformat, nach dem ich suche, wird von einem Standard mit einem XSD diktiert, und ich kann es nicht ändern.

Irgendwelche guten Ideen?

+0

Danke für die Bearbeitung @ MUG4N. Nicht ganz sicher, wo dieser Anfang [ging, weil es in dem Code war, den ich ursprünglich kopierte! – StuartR143

Antwort

0

Folgendes könnte Ihren Anforderungen entsprechen.
Es analysiert die Ausgabezeichenfolge des Flags und bestimmt, ob der Inhalt ein XElement oder eine Liste von sein soll.

public static object GetDaysOfWeekXelementContent(DaysOfWeek pf) 
{ 
    var pfStr = pf.ToString(); 
    if (pfStr.Contains(",")) 
    { 
     return pfStr.Split(',').Select(x => new XElement(x.Trim())); 
    } 
    else 
    { 
     return new XElement(pfStr); 
    } 
} 

static void Main(string[] args) 
{ 
    List<DaysOfWeek> profiles = new List<DaysOfWeek>(); 
    profiles.Add(DaysOfWeek.MondayToFriday); 
    profiles.Add(DaysOfWeek.MondayToSaturday); 
    profiles.Add(DaysOfWeek.Monday | DaysOfWeek.Tuesday); 

    XElement xml = new XElement("Profiles", 
         from DaysOfWeek pf in profiles 
         select new XElement("Profile", GetDaysOfWeekXelementContent(pf)) 
        ); 
    Console.WriteLine(xml); 
} 

bearbeiten In Bezug auf Sortierung der Werte erklären Sie sich Werte von Sonntag auf Montag. Sie können die Werte nacheinander analysieren und sie absteigend sortieren, um Montag bis Sonntag zu haben.
Folgendes sollte tun:

public static object GetDaysOfWeekXelementContent(DaysOfWeek pf) 
{ 
    var pfStr = pf.ToString(); 
    if (pfStr.Contains(",")) 
    { 
     return pfStr.Split(',').Reverse().Select(x => new XElement(x.Trim())); 
    } 
    else 
    { 
     return new XElement(pfStr); 
    } 
} 
+0

Es scheint ein vernünftiger Ansatz. Wenn ich 'return pfStr.Split (','). Reverse() verwende, wähle (x => new XElement (x.Trim()));' das sollte auch die umgekehrte Wochentage lösen? – StuartR143

+0

Aber warum die down vote? – StuartR143

+0

@ StuartR143 suchen Sie die Tage sortiert alphabetisch oder über den Enum-Wert? – StfBln