我正在开发一个自动跟进系统,用于注册“Project”当前状态的高度过时的技术。本系统中的GUI交互使用名为“flags”的用户可以“检查”以指定项目的当前状态。有11个可以检查的盒子,系统可以接受多个选择。
例如,用户可以选择标记为“已确认”和/或“需要跟进”和/或“已安排”和/或“与客户口语”的复选框(有11种可能的选择)。
这是问题所在 - 无论是谁写了这个选项都以“位总和”将这些选择保存到数据库中,所以你看到的是原始位[]的int用于复选框选择。
我需要做的是从数据库读取整数并将其转回11位值为1 ||的位数组0然后从该位数组我需要确定检查哪些字符串值框以确定天气我需要执行自动跟进。
所以基本上如果“确认”被选中,我不想跟进 如果选中“需要跟进”,我需要跟进。
这里的问题是可能存在多个选择。
所以在将int转换为[]后,我们就有了例如
1,0,1,0,0,0,1,1,1,0,1其中每个int代表一个检查框。
我需要找到一种方法将上面的内容转换为表示框标签的字符串数组,以确定检查哪些框。
答案 0 :(得分: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
如果您使用的是.NET 4或更高版本,还有一个Enum.HasFlags
扩展方法可以简化此操作。
如果你不希望这样做,你可以通过这样做来确定位置x
的位是否设置:
bool isSet = ( intFromDb & ( 1 << x ) ) != 0;
并使用它来构建你的字符串。
编辑:我还建议您阅读有关按位运算符及其功能的内容。这可能是一个好的开始:http://blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx