遍历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,而不是我如何调用该方法。遍历标志枚举中的值?

遍历Flags枚举中的值,但保持顺序

我现在需要遍历这些值,但要保持枚举传递给方法的顺序。

没有这样的概念。|运算符没有任何保持排序的方法。换句话说,想象一下我们有:

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

检查这样的东西是否适合您