遍历Flags枚举中的值,但保持顺序
本文关键字:顺序 Flags 枚举 遍历 | 更新日期: 2023-09-27 18:28:41
我的代码中有以下enum
:
[Flags]
public enum Column
{
FirstName = 1 << 0,
LastName = 1 << 1,
Address = 1 << 2,
}
现在我有了一个方法,可以使用enum
。
public void ParseColumns(Column col)
{
//do some parsing...
}
这种方法可以这样调用:
ParseColumns(Column.FirstName | Column.LastName);
ParseColumns(Column.LastName);
ParseColumns(Column.LastName | Column.Address | Column.FirstName);
ParseColumns(Column.Address | Column.FirstName);
我现在需要遍历这些值,但要保持enum
传递给方法的顺序。
我找到了下面的方法,它让我有可能对它们进行迭代,但遗憾的是,它返回了在Enum
中定义的Order,而不是我如何调用该方法。遍历标志枚举中的值?
我现在需要遍历这些值,但要保持枚举传递给方法的顺序。
没有这样的概念。|
运算符没有任何保持排序的方法。换句话说,想象一下我们有:
public void Foo(int x)
你用来称呼它
Foo(1 + 4)
Foo(2 + 3)
你希望它如何区分?如果您需要传入单独的值,并保留特定的顺序,您可能应该使用:
public void ParseColumns(params Column[] columns)
在这一点上,您可能希望避免它成为一个标志枚举。
这根本不可能。
标志枚举值通过添加单个项的值来工作(每个项都是一个唯一的位)。
加法是可交换的,所以你不知道它们是按哪个顺序加的
考虑接受非标志枚举值的(params
)数组。
这是不可能的,但这是一个有趣但不太好的想法。。。
您可以将扩展方法(因为运算符重载不起作用)与位偏移相结合。。。序列化然后反序列化值。。。听起来还是个坏主意,哈哈哈。
public static Column OR(this Column original, Column newc) {
return (Column) ((int)original)| (((int) newc) << 3)
}
public static Column Get(this Column original) {
// Some iterator that looks almost like the one you already have
}
public static Column GetOrder(this Column original) {
// Some iterator that looks almost like the one you already have
}
那么你可以这样称呼这个
ParseColumns(Column.FirstName.OR(Column.LastName))
然后是类似的含义:
public void ParseColumns(Column col)
{
col.Get();
col.GetOrder();
}
检查这样的东西是否适合您