使用标志枚举的 XElement
XElement using 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,
}
我在下面的简化示例中使用它来输出 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 的格式需要扩展,以便我在一周中的几天得到空元素,但如果我这样做,"Tuesday, Monday" 元素会抛出异常,因为我不能' t 使用逗号(或 space)作为元素名称的一部分。
但是
a) 如果不使用预定义的日期组之一,我需要按照模式给出的特定顺序(星期一、星期二、星期三、星期四、星期五、星期六、星期日)编写元素 (见下文 c)。我让自己变得更难了,因为我已经将它们反向定义,星期一作为高位,但这是因为我首先处理的旧数据格式将日期作为标志 (1/0) 在字符串中呈现该命令例如星期一和星期二是“1100000”(左边是星期一,右边是星期日);
b) 我希望能够输出适当的元素而不必单独测试所有内容(尽管我想如果必须的话我将不得不这样做);和
c) 我正在寻找的输出 XML 格式是由带有 XSD 的标准规定的,我无法更改它。
有什么好主意吗?
以下可能适合您的需要。
它解析标志的输出字符串并确定内容应该是 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);
}
}
在我的代码中,我有一个星期几的标志枚举,如下所示:
[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 的格式需要扩展,以便我在一周中的几天得到空元素,但如果我这样做,"Tuesday, Monday" 元素会抛出异常,因为我不能' t 使用逗号(或 space)作为元素名称的一部分。
但是
a) 如果不使用预定义的日期组之一,我需要按照模式给出的特定顺序(星期一、星期二、星期三、星期四、星期五、星期六、星期日)编写元素 (见下文 c)。我让自己变得更难了,因为我已经将它们反向定义,星期一作为高位,但这是因为我首先处理的旧数据格式将日期作为标志 (1/0) 在字符串中呈现该命令例如星期一和星期二是“1100000”(左边是星期一,右边是星期日);
b) 我希望能够输出适当的元素而不必单独测试所有内容(尽管我想如果必须的话我将不得不这样做);和
c) 我正在寻找的输出 XML 格式是由带有 XSD 的标准规定的,我无法更改它。
有什么好主意吗?
以下可能适合您的需要。
它解析标志的输出字符串并确定内容应该是 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);
}
}