2016-04-06 4 views
0

Я работаю над консольным календарем в качестве учебной задачи (школы). Он должен отображать лист календаря для определенного месяца, в который пользователь вводит. Я почти там, но я заметил, что теперь все месяцы начинаются в понедельник. Я создал лист с помощью стробоскопа, и я попытался заполнить дни до того, как первый день месяца на самом деле приходит с нулями, но он пока не работает. Для петли моя попытка. У кого-нибудь есть идеи? Я все еще учусь. Вот код, который создает лист, whichs отлично работает в стороне от этого вопроса:Консольный календарь с строковым календарем

DateTime date = DateTime.Now; 
     List<DateTime> dateList = new List<DateTime>(); 

     DateTime dateCopyForModification = date; 

     int inputMonth = date.Month; 

     while (dateCopyForModification.Month == inputMonth) 
     { 
      dateList.Add(dateCopyForModification); 
      dateCopyForModification = dateCopyForModification.AddDays(1); 
     } 

     Console.WriteLine("\t---------\n\t{0}, {1}\n\t---------", date.ToString("MMMM"), date.Year); 

     int dayCounter = 0; 
     StringBuilder stringBuilder = new StringBuilder(); 

     stringBuilder.Append("\nMo\t|\tDi\t|\tMi\t|\tDo\t|\tFr\t|\tSa\t|\tSo\t|\n-----------------------------------------------------------------------------------------------------\n"); 


     foreach (DateTime dateTime in dateList) 
     { 

//the part that doesnt work 
      int day = (int)dateTime.DayOfWeek; 

      if (dateTime == new DateTime(dateTime.Year, dateTime.Month, 1)) 
      { 
       for (day = 1; day == (int)dateTime.DayOfWeek; day++) 
       { 
        stringBuilder.Append("0"); 
        dayCounter++; 
       } 
      } 
//until here 
      else 
      { 
       stringBuilder.Append(dateTime.Day); 
       dayCounter++; 
      } 

      if (dateTime.Day == 28) 
      { 
       stringBuilder.Append(" |"); 
      } 
      else 
      { 
       stringBuilder.Append("\t|\t"); 
      } 

      if (dayCounter == 7) 
      { 
       stringBuilder.Append("\n"); 
       dayCounter = 0; 
      } 

     } 
     Console.Write(stringBuilder); 
     Console.ReadKey(); 
+0

Я боюсь, что мне не совсем ясно, что вы пытаетесь сделать, или каков текущий результат. Не могли бы вы уменьшить это до [mcve]? Похоже, что только внутренний цикл имеет значение, но мы не можем точно сказать - конкретный пример облегчит вам помощь. –

+0

Остальная часть кода, означая все, кроме внутреннего for-цикла и оператора if, просто создает лист календаря. У столбцов есть Mo-Fr как названия, а ниже - даты, точно так же, как календарь Windows. То, как я добавляю даты, но всегда начинается в понедельник, и я хочу подтолкнуть это к фактическому будничному дню, который является первым месяцем. Я оставлю все остальное. – tweedledum11

+0

Чтобы понять проблему, нужна ли нам внешняя петля foreach? Можете ли вы преобразовать это в * полный * пример с жестко запрограммированной датой и в полном консольном приложении, которое мы можем скопировать, вставить, скомпилировать и запустить? Чем проще вы сделаете это для нас, чтобы воспроизвести проблему, тем легче мы сможем вам помочь. –

ответ

0

Я создал небольшое решение для вашего problem.However не использовать StringBuilder

//This class will store the given month information 
class MonthInfo 
{ 
    public DayOfWeek DayName { get; set; } 
    public DateTime DayDate { get; set; } 
} 

//This class will store the cursor position, just to make it look like a calendar 
class CursorPosition 
{ 
    public string DayName { get; set; } 
    public DayOfWeek DayWeek { get; set; } 
    public int locationx { get; set; } 


} 

и вот остальная часть кода

static void Main(string[] args) 
    { 
     int monthdigit = 0; 
     DateTime _date; 


     Console.WriteLine("Enter Month"); 
     string monthName= Console.ReadLine(); //should be in format "Jan","Feb" 


     if (DateTime.TryParseExact(monthName, "MMM", CultureInfo.InvariantCulture, DateTimeStyles.None, out _date)) 
     { 
      monthdigit = (int)_date.Month; 
     } 
     else 
     { 
      Console.WriteLine("invalid..programm will exit"); 
      return; 
     } 




     List<MonthInfo> GetMyDate = GetDates(2016, monthdigit); 


     //stores the cursor position to align the days accordingly 
     List<CursorPosition> CurorList = new List<CursorPosition>(); 
     CurorList.Add(new CursorPosition() { DayName = "Sun", DayWeek=DayOfWeek.Sunday }); 
     CurorList.Add(new CursorPosition() { DayName = "Mon", DayWeek = DayOfWeek.Monday }); 
     CurorList.Add(new CursorPosition() { DayName = "Tue", DayWeek = DayOfWeek.Tuesday }); 
     CurorList.Add(new CursorPosition() { DayName = "Wed", DayWeek = DayOfWeek.Wednesday }); 
     CurorList.Add(new CursorPosition() { DayName = "Thu", DayWeek = DayOfWeek.Thursday }); 
     CurorList.Add(new CursorPosition() { DayName = "Fri", DayWeek = DayOfWeek.Friday }); 
     CurorList.Add(new CursorPosition() { DayName = "Sat", DayWeek = DayOfWeek.Saturday }); 


     //print all the days name 
     foreach (CursorPosition _activeCursor in CurorList) 
     { 
       Console.Write("\t{0}",_activeCursor.DayName); 
       _activeCursor.locationx = Console.CursorLeft; 

     } 



     //retreive the cursor position and display your day index by adjusting the rownumber accordingly. 
     int _dayIndex = 1; 
     int rownumber = 2; 

     foreach (MonthInfo _month in GetMyDate) 
     { 
      Console.WriteLine(); 

       int positionx = (from p in CurorList 
           where p.DayWeek == _month.DayName 
           select p.locationx).Single(); 



      Console.SetCursorPosition(positionx, rownumber + 1); 
      Console.Write(_dayIndex++.ToString()); 



       if ((int)_month.DayName== 6) 
       { 
        rownumber++; 
        Console.WriteLine(); 
       } 



     } 

     Console.ReadKey(); 

    } 

    public static List<MonthInfo> GetDates(int year, int month) 
    { 
     var query=from date in Enumerable.Range(1, DateTime.DaysInMonth(year, month)) // Days: 1, 2 ... 31 etc. 
        select new MonthInfo() { DayName = new DateTime(year, month, date).DayOfWeek, DayDate = new DateTime(year, month, date) }; 

     return query.ToList(); 
    } 
+0

Большое спасибо. Дело в том, что мой календарь работает по-другому, намного проще, потому что часть используемого вами кода кажется довольно продвинутой. Я нахожусь в первой из трех лет обучения, и нам нужно объяснить, что мы используем, и как мы кодируем все это, поэтому это делает его довольно сложным. Сейчас мой календарь работает, читая клавиши, нажатые пользователем, что означает: RightArrow key = Переход к следующему месяцу и т. Д. Я знаю, что stringbuilder может быть не идеальным, но разве нет способа начать добавление, когда будет найден первый день месяца? – tweedledum11