-3

我正在开发一个关于注册“项目”当前状态的高度过时技术的自动跟踪系统,该系统中的 GUI 交互使用所谓的“标志”,用户可以“检查”来指定当前状态一个专案。可以选中 11 个可能的框,系统接受多项选择。

例如,用户可以选择标记为“已确认”和/或“需要跟进”和/或“已安排”和/或“与客户交谈”的复选框(有 11 种可能的选择)。

这就是问题所在——无论是谁写的,都将这些选择以“位总和”的形式保存到数据库中,所以您看到的是复选框选择的原始位 [] 的整数。

我需要做的是从数据库中读取整数并将其转回一个包含 11 个值的位数组 || 0 然后从该位数组中,我需要确定检查哪些字符串值框以确定天气是否需要执行自动跟进。

所以基本上如果“确认”被选中,我不想跟进如果“需要跟进”被选中,我需要跟进。

这里的问题是可以存在多个选择。

所以在 int 变成 bit[] 之后,我们有例如

1,0,1,0,0,0,1,1,1,0,1 其中每个 int 代表一个选中的框。

我需要找到一种方法将上述内容转换为表示框标签的字符串数组,以确定选中哪些框。

4

1 回答 1

3

在 C# 中执行此操作的常用方法是使用标志枚举 - 这正是您的位字段。

[Flags]
enum ProjectStatus
{
    Confirmed = 1,
    NeedsFollowUp = 2,
    SpokenWithClient = 4,
    ....
}

要测试是否设置了特定标志:

ProjectStatus status = (ProjectStatus)intFromDb;
if( ( status & ProjectStatus.Confirmed ) == ProjectStatus.Confirmed )
    // the Confirmed flag is set

Enum.HasFlags如果您使用 .NET 4 或更高版本,还有一种扩展方法可以简化此操作。

如果您不想这样做,您可以x通过执行以下操作来确定 position 的位是否设置:

bool isSet = ( intFromDb & ( 1 << x ) ) != 0;

并用它来构建你的字符串。

编辑:我还建议您阅读一下按位运算符及其作用。这可能是一个好的开始:http ://blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx

于 2013-10-15T20:32:51.847 回答