gpt4 book ai didi

c# - 索引位由通用枚举定义的 BitArray

转载 作者:太空宇宙 更新时间:2023-11-03 20:13:36 25 4
gpt4 key购买 nike

我正在从医疗设备中提取字节流,遇到了一个非常烦人的数据结构。基本上,我得到一个 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 的类型派生的枚举,例如 uintlong ulong,变得更加复杂,因为 BitArray 的索引器使用 int)

关于c# - 索引位由通用枚举定义的 BitArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18277883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com