我有一个定义如下的枚举:
[Flags]
public enum MyEnum
{
None = 0,
ValueOne = 1 << 0,
ValueTwo = 1 << 1,
ValueThree = 1 << 2,
ValueFour = 1 << 3,
...
ValueTwoEightyOne = 1 << 280,
}
我希望能够将使用率转换为可能的最短字符串,类似于:
var compressedString = ConvertToCompressedString(MyEnum.ValueOne | MyEnum.ValueThree | MyEnum.ValueFour);
然后在程序的不同部分,我想将compressedString转换回枚举
var enumValue = ConvertBack(compressedString);
使用如此多的值转换枚举的有效方法是什么?如果有更好的方法来处理这种用例,我很感兴趣。
答案 0 :(得分:2)
enum
值由内存中的整数字段支持。那么你需要的压缩比整数本身还要多吗?
MyEnum value = MyEnum.ValueOne | MyEnum.ValueThree | MyEnum.ValueFour;
int i = (int)value;
// transport i
但要小心,因为1&lt;&lt; 280(2 ^ 280)是一个非常大的数字,无法存储在Int32
甚至Int64
中。
答案 1 :(得分:1)
如果我需要一个带有超过64个标志的“Flags enum”,我可能只使用一个enum作为位索引,然后将BitArray包装在一个类中以保存这些值。
要获得紧凑表示,可以将位数组转换为字节数组。我从代码中省略了该步骤,但您可以执行以下操作: like this(注意字节序!)
public class LargeFlagsEnum<T> where T : struct
{
private BitArray bits;
public LargeFlagsEnum(int numBits)
{
if (!(typeof(T).IsEnum))
throw new ArgumentException("Expected enum type");
bits = new BitArray(numBits);
}
public byte[] GetBytes()
{
return bits.ConvertToByteArray();
}
public void Set(T flag, bool value)
{
bits[Convert.ToInt32(flag)] = value;
}
public bool Get(T flag)
{
return bits[Convert.ToInt32(flag)];
}
}
// Example:
enum MyFlags
{
First = 1,
SomethingElse = 280,
}
class Example
{
void Main()
{
var someFlags = new LargeFlagsEnum<MyFlags>(281);
someFlags.Set(MyFlags.SomethingElse, true);
Transmit(someFlags.GetBytes());
}
}