- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在从医疗设备中提取字节流,遇到了一个非常烦人的数据结构。基本上,我得到一个 2 字节的 block ,其中每个位代表一个 bool 值。这种结构在字节流中出现的频率足以围绕它开发结构/类,但在每种情况下,这些位的含义完全不同。
所以首先我设置了一堆枚举来表示位结构可能具有的所有不同定义。 (请注意,并非每个位都用于每个定义。有时重要位之间会有中断。)
编辑:删除了所有看起来像“旗帜”的名字。我没有使用 [Flags] 属性,这似乎是争论/混淆的焦点。枚举值只是映射到我的 BitArray 中的索引。
public enum RecordInfo { AM_TEST = 0, PM_TEST, TEST_VALIDITY };
public enum RecordAlerts { ALERT1 = 0, ALERT2, ALERT3, ALERT4, VALIDATED = 15 };
然后创建这个容器来保存实际的位:
public struct TwoBytes<TEnum> where TEnum : struct, IConvertible
{
private BitArray _bits = new BitArray(2);
}
这似乎可以按我的需要工作,直到我想根据枚举名称为我的结构编制索引。假设我有一个名为 Alerts 的 TwoByte 结构,其中包含一些位值。如果我想获得这样的特定标志:
bool alert3Set = Alerts[RecordAlerts.ALERT3]
我最终得到了一个真正令人发指的索引函数。这就是我现在所拥有的:
public bool this[TEnum name]
{
get
{
int index = Enum.GetValues(typeof(TEnum)).Cast<TEnum>().ToList().Where(x => x.Equals(name)).Cast<int>().First();
return _bits[index];
}
}
现在可以用了,太疯狂了。但是 LINQ 链看起来非常糟糕,需要一段时间才能破译它的实际作用。
是否有更简洁、更有效的方法将通用枚举“名称”转换为其整数值?或者我会更适合使用字典(或其他一些对象)来表示位结构定义吗?
最佳答案
只要您使用的每个 TEnum
都派生自 int
(默认值),而不是其他数字类型,这就可以工作:
public bool this[TEnum name]
{
get
{
int index = (int)(object)name;
return _bits[index];
}
}
如果你想支持从较小类型派生的枚举
(以及只使用int
支持的范围内的值的枚举),我会使用:
public bool this[TEnum name]
{
get
{
int index = Convert.ToInt32(name);
return _bits[index];
}
}
(完全支持从无法隐式转换为 int
的类型派生的枚举,例如 uint
、long
和 ulong
,变得更加复杂,因为 BitArray
的索引器使用 int
)
关于c# - 索引位由通用枚举定义的 BitArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18277883/
我是一名优秀的程序员,十分优秀!