嗨那里,我对编程有点新意,更多的是一种爱好。我想知道以下逻辑或技术是否具有特定名称或术语。我目前的项目有7个复选框,每周一个。我需要一个容易保存哪些盒子进行检查。
以下是将复选框保存为单个数字的方法。每个复选框都会获得一个比上一个复选框加倍的值。当我想知道哪些盒子被检查时,我向后工作,看看我可以用总值除以复选框值多少次。
private int SetSelectedDays()
{
int selectedDays = 0;
selectedDays += (dayMon.Checked) ? 1 : 0;
selectedDays += (dayTue.Checked) ? 2 : 0;
selectedDays += (dayWed.Checked) ? 4 : 0;
selectedDays += (dayThu.Checked) ? 8 : 0;
selectedDays += (dayFri.Checked) ? 16 : 0;
selectedDays += (daySat.Checked) ? 32 : 0;
selectedDays += (daySun.Checked) ? 64 : 0;
return selectedDays;
}
private void SelectedDays(int n)
{
if ((n / 64 >= 1) & !(n / 64 >= 2))
{
n -= 64;
daySun.Checked = true;
}
if ((n / 32 >= 1) & !(n / 32 >= 2))
{
n -= 32;
daySat.Checked = true;
}
if ((n / 16 >= 1) & !(n / 16 >= 2))
{
n -= 16;
dayFri.Checked = true;
}
if ((n / 8 >= 1) & !(n / 8 >= 2))
{
n -= 8;
dayThu.Checked = true;
}
if ((n / 4 >= 1) & !(n / 4 >= 2))
{
n -= 4;
dayWed.Checked = true;
}
if ((n / 2 >= 1) & !(n / 2 >= 2))
{
n -= 2;
dayTue.Checked = true;
}
if ((n / 1 >= 1) & !(n / 1 >= 2))
{
n -= 1;
dayMon.Checked = true;
}
if (n > 0)
{
//log event
}
}
该方法适用于我需要的方法,但是,如果您确实看到了另一种方法,或者更好的写作方式,我会对您的建议感兴趣。
答案 0 :(得分:6)
其他人提到了位掩码,但我想我会告诉你一种简化代码的方法。
daySun.Checked = (n & 64) == 64;
daySat.Checked = (n & 32) == 32;
dayFri.Checked = (n & 16) == 16;
dayThu.Checked = (n & 8) == 8;
dayWed.Checked = (n & 4) == 4;
dayTue.Checked = (n & 2) == 2;
dayMon.Checked = (n & 1) == 1;
答案 1 :(得分:4)
这类似于bitmasking。当我找到本周我使用这个确切示例阅读的博客时,我会发布它!
啊得到了! Here it is
然后您可以执行以下操作:
DaysOfWeek week = DaysOfWeek.Sunday | DaysOfWeek.Monday;
选择星期日和星期一。或者在您的示例中,当您检查每个复选框的值时,您可以执行以下操作:
DaysOfWeek week = DaysOfWeek.None; // DaysOfWeek.None = 0
if (Monday.Checked)
{
week |= DaysOfWeek.Monday;
}
并检查是否设置了特定日期:
DaysOfWeek week = DaysOfWeek.Monday | DaysOfWeek.Tuesday;
// this will be FALSE (so Wednesday will remain unchecked) because "week" contains Monday/Tuesday, but not Wednesday.
if ((week & DaysOfWeek.Wednesday) == DaysOfWeek.Wednesday)
{
Wednesday.Checked = true;
}
修改强>
.NET的内置DayOfWeek不允许对多个值进行位掩码,因此您需要滚动自己的DaysOfWeek
枚举。
答案 2 :(得分:3)
您可以创建一个包含所有日期的枚举,并使用属性[Flags]标记它,然后每天给出与您的(bla.checked)相同的值? XX ..
然后你可以使用+ =,和,或者获得相同的功能..
所以检查一个值是否包含让你说星期一你会做
if(myEnum& Days.Monday == Days.Monday) { ... }
答案 3 :(得分:1)
它被称为bitmasking,你可以使用Enum with the Flags attribute更轻松地做同样的事情。
答案 4 :(得分:1)
它被称为位域,是的,它是解决这个问题的最节省空间的方法。使用单独的布尔可能会使用更多的内存,但IMO的可读性更高,价值大约为6个字节左右。
答案 5 :(得分:0)
你可以使用枚举......它更具可读性和漂亮性
public enum daysOfWeek
{
Mon = 1, Tue = 2, Wed = 4, Thu = 8, Fri = 16, Sat = 32, Sun = 64
}
答案 6 :(得分:0)
你可以隐藏功能的复杂性: 并且最好是按位移位而不是分割
private bool get_bit(int val, int idx)
{
return ((val >> idx) & 1) != 0;
}