我有一个for循环,检查是否选中了一些复选框
foreach (CheckBox chk in this.Controls.OfType<CheckBox>())
{
if (chk.Checked)
{
//Some code here
}
}
共有12个复选框,每月1个。
我想要的是计算变量StartDate和上个月之间的天数。很难解释抱歉。
例如,StartDate = 1st September 2010
,Checked Boxes是4月,10月和12月。
结果应该是2010年9月1日至2011年4月1日之间的日子。
如果StartDate = 2010年11月1日,则结果将是2010年11月1日至2011年10月1日之间的天数。
我觉得我很挣扎,因为循环从jan到dec。如果它从开始月份开始我就没事了。
如果我需要解释更多,请提出一些问题。
答案 0 :(得分:1)
假设您只对DateTime逻辑感兴趣,那么应该这样做:
private static TimeSpan GetLatestSpan(IEnumerable<int> monthNumbers, DateTime startDate)
{
var candidateDates = monthNumbers
.Select(month => GetNearestDateInDifferentMonthWithSameDay(startDate, month));
return candidateDates.Max() - startDate;
}
private static DateTime GetNearestDateInDifferentMonthWithSameDay(DateTime startDate, int month)
{
return new DateTime(month > startDate.Month ? startDate.Year : startDate.Year + 1, month, startDate.Day);
}
使用您的示例,
var checkedMonthNumbers = new List<int>();
foreach (CheckBox chk in this.Controls.OfType<CheckBox>())
{
if (chk.Checked)
{
checkedMonthNumbers.Add(GetMonthNumberFromCheckBox(chk));
}
}
MessageBox.Show("Required timespan is " + GetLatestSpan(checkedMonthNumbers, StartDate));
编辑:
请注意,我可能会将循环重写为:
var checkedMonthNumbers = Controls.OfType<CheckBox>()
.Where(chk => ck.Checked)
.Select(chk => GetMonthNumberFromCheckBox(chk));
答案 1 :(得分:0)
int num=0,currentyear=2010;
for(i=startmonth;i<endmonth;i++)
{
if(i=13)
{
i=1;
currentyear++
}
num+=datetime.daysinmonth(currentyear,i);
}
我认为它会对你有用
答案 2 :(得分:0)
搜索所选月份 距离前月份的startDate。所以基本上只是在前几个月才进行搜索。
如果没有,请选择上个月 从列表中。