Получить последний месяц выбранных флажков - PullRequest
0 голосов
/ 12 августа 2010

У меня есть цикл for, который проверяет, установлены ли некоторые флажки

foreach (CheckBox chk in this.Controls.OfType<CheckBox>())
{
    if (chk.Checked)
    {
        //Some code here
    }
}

Есть 12 флажков, по 1 на каждый месяц.

То, что я хочу, - это рассчитать количество дней между переменной StartDate и последним месяцем. Трудно объяснить, извините.

Например, StartDate = 1st September 2010, флажки отмечены в апреле, октябре и декабре.

Результатом должны быть дни между 01.09.2010 и 01.04.2011.

Если StartDate = 1 ноября 2010 г., то результатом будут дни с 01/11/2010 по 01.10.2011.

Я думаю, что изо всех сил, потому что цикл идет от января до декабря. Если бы это было начато с начала месяца, я был бы в порядке.

Пожалуйста, задайте несколько вопросов, если мне нужно объяснить больше.

Ответы [ 3 ]

1 голос
/ 14 августа 2010

Если вы интересуетесь только логикой 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));

EDIT:

Обратите внимание, что я, вероятно, переписал бы цикл как:

var checkedMonthNumbers = Controls.OfType<CheckBox>()
                                  .Where(chk => ck.Checked)
                                  .Select(chk => GetMonthNumberFromCheckBox(chk));
0 голосов
/ 15 августа 2010
  • Поиск выбранных месяцев для ближайшего предшествующего месяца до startDate.Поэтому в основном просто ищите только предыдущие месяцы.

  • Если их нет, выберите последний месяц из списка.

0 голосов
/ 12 августа 2010
int num=0,currentyear=2010;
for(i=startmonth;i<endmonth;i++)
{
if(i=13)
{
i=1;
currentyear++
}
num+=datetime.daysinmonth(currentyear,i);
}

Я думаю, что это будет работать для вас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...