【问题标题】:XElement using Flags EnumXElement 使用标志枚举
【发布时间】:2017-08-06 11:47:36
【问题描述】:

在我的代码中,我有一个星期几的标志枚举,如下所示:

[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,
}

我在下面的简化示例中使用它来输出 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);

这给了我输出:

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

但我想要的是:

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

我很欣赏需要扩展我的 XElement 的格式,以便我在一周中的几天获得空元素,但如果我这样做,那么“星期二,星期一”元素会引发异常,因为我不能使用逗号(或空格)作为元素名称的一部分。

但是

a) 如果不使用预定义的天组之一,我需要按照模式给出的特定顺序(星期一、星期二、星期三、星期四、星期五、星期六、星期日)编写元素(参见 c以下)。我让自己变得更难了,因为我将它们定义为相反的,星期一是高位,但这是因为我首先处理的旧数据格式将日期表示为字符串中的标志 (1/0)该命令例如周一和周二是“1100000”(左边是周一,右边是周日);

b) 我希望能够输出适当的元素,而不必单独测试所有内容(尽管我想如果必须的话我必须这样做);和

c) 我正在寻找的输出 XML 格式是由带有 XSD 的标准规定的,我无法更改它。

有什么好主意吗?

【问题讨论】:

  • 感谢@MUG4N 的编辑。不太清楚最初的 [ 去了哪里,因为它在我最初复制的代码中!

标签: c# xelement enum-flags


【解决方案1】:

以下内容可能适合您的需求。
它解析标志的输出字符串并确定内容应该是 XElement 还是列表。

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

编辑 关于值的排序,您声明从星期日到星期一的值。您可以逐个解析这些值,将它们降序排列,以便有星期一到星期日。
应该这样做:

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

【讨论】:

  • 这似乎是一个合理的方法。如果我使用return pfStr.Split(',').Reverse().Select(x =&gt; new XElement(x.Trim()));,那也应该可以解决星期几反转的问题?
  • @StuartR143 您是否希望按字母顺序或通过枚举值排序日期?
  • @StfBIn 我在原始问题中编辑了 (a) 以更全面地解释我想要什么以及为什么
  • @StfBIn 这看起来比只使用Reverse() 更复杂,而且它实际上在做什么也不太可读。是否存在性能问题意味着我不应该,或者......?
  • @StuartR143 如果您按字母顺序排序,星期五将在星期一之前到来。由于您已经通过枚举定义了您的值,因此最好以这种方式使用它们,至少您可以预测结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多