【问题标题】:Using Loops and Arrays to go through A Year使用循环和数组度过一年
【发布时间】:2015-12-19 01:52:33
【问题描述】:

这里(和 C#)相当新,我想我会在碰壁时寻求帮助。目前,我正在尝试用 C# 编写一个程序,该程序将允许我以

格式在 2015 年日历中显示每一天
Thursday Jan 1
Friday Jan 2
....
Thursday Dec 31

每个日期都打印在不同的行上,并且每个月底都会有一个命令,使用户按下一个键就可以进入下个月。

我将我的 3 个数组设置为

string[] MonthsOfTheYear = new string[] { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };

int[] DaysOfTheMonth = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

string[] DaysOfTheWeek = new string[] { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };

我严格执行此操作,不使用任何形式的 DateTime。我只坚持 for 和 foreach 循环。

最初的开始时间是星期四 (4),所以我还需要一些帮助来尝试让 daysOfTheWeek 回到 0(星期日)并继续这样,直到我达到一年中的最后一个日期。

任何帮助将不胜感激

【问题讨论】:

    标签: c# arrays for-loop


    【解决方案1】:

    有些事情你真的应该使用DateTime 类型(或类似的专业时间API)。这包括获取特定日期的星期几和获取月中的天数。你不会相信现实世界中有多少地方会被捏造。

    所以,一分钱,一英镑/美元,对吧?整个程序:

    using System;
    using System.Linq;
    
    class Program
    {
        static void Main(string[] args)
        {
            var year = DateTime.Today.Year;
            foreach (var month in Enumerable.Range(1, 12))
            {
                foreach (var day in Enumerable.Range(1, DateTime.DaysInMonth(year, month))
                          .Select(day => new DateTime(year, month, day).ToString("dddd MMM d")))
                {
                    Console.WriteLine(day);
                }  
                Console.WriteLine("Press a key to continue...");
                Console.ReadKey(true);
            }
        }
    }
    

    这也比基于数组的方法更好,因为它可以正确处理使用不同文化/语言设置运行的计算机。

    我倾向于喜欢Enumerable.Range(),因为它让您思考如何绑定到数据源。但是如果你真的很难遵循这个,你可以使用for循环而不是foreach

    using System;
    using System.Linq;
    
    class Program
    {
        static void Main(string[] args)
        {
            var year = DateTime.Today.Year;
            for(int month = 1; month <= 12; month++)
            {
                for(int day = 1; day <= DateTime.DaysInMonth(year, month); day++)
                {
                    Console.WriteLine(new DateTime(year, month, day).ToString("dddd MMM d"));
                }  
                Console.WriteLine("Press a key to continue...");
                Console.ReadKey(true);
            }
        }
    }
    

    如果你真的很想做到这一点,我们至少可以使用数组查找来获取名称和星期几。我仍然坚持使用DateTime 类型来查找月份中的天数和一年中第一天的星期几。如果这是家庭作业或其他给你不合理的约束,那么这应该足够你找到剩下的代码了:

    using System;
    using System.Globalization;
    using System.Linq;
    
    class Program
    {
        static void Main(string[] args)
        {
            var year = DateTime.Today.Year;
            //FIRST DAY OF THE WEEK IS CUSTOMIZABLE/SYSTEM DEPENDANT!
            var dayOffset = (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek + (int)(new DateTime(year, 1, 1).DayOfWeek) ;
            var dayNames = new string[] {"", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" };
            var monthNames = new string[] { "", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
    
            var dayOfYear = 1;
            foreach (var month in Enumerable.Range(1, 12))
            {
                foreach (var dayOfMonth in Enumerable.Range(1, DateTime.DaysInMonth(year, month)))
                {
                    Console.WriteLine("{0} {1} {2}", dayNames[(dayOfYear % 7) + dayOffset], monthNames[month], dayOfMonth);
                    dayOfYear++;
                }  
                Console.WriteLine("Press a key to continue...");
                Console.ReadKey(true);
            }
        }
    }
    

    我将再提供一个答案,我将数组定义修复为使用系统区域设置相关的月份和工作日名称:

    using System;
    using System.Globalization;
    using System.Linq;
    
    class Program
    {
        static void Main(string[] args)
        {
            var year = DateTime.Today.Year;
            var Jan1 = new DateTime(year, 1, 1);
            var dayNames = Enumerable.Range(0, 7).Select(d => Jan1.AddDays(d).ToString("dddd")).ToArray();
            var monthNames = Enumerable.Range(1,12).Select(m => new DateTime(year, m, 1).ToString("MMM")).ToArray();
    
            var dayOfYear = 0;
            foreach (var month in Enumerable.Range(1, 12))
            {
                foreach (var dayOfMonth in Enumerable.Range(1, DateTime.DaysInMonth(year, month)))
                {
                    Console.WriteLine("{0} {1} {2}", dayNames[dayOfYear % 7], monthNames[month-1], dayOfMonth);
                    dayOfYear++;
                }  
                Console.WriteLine("Press a key to continue...");
                Console.ReadKey(true);
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      试试这个:

      var weekdayIndex = 4;
      for (var index = 0; index < MonthsOfTheYear.Length; index++)
      {
          for (var day = 1; day <= DaysOfTheMonth[index]; day++)
          {
              Console.WriteLine(String.Format("{0} {1} {2}", DaysOfTheWeek[weekdayIndex++ % 7], MonthsOfTheYear[index], day));
          }
      }
      

      【讨论】:

      • 这是一个起点,但是当我尝试运行它时,代码不会移动到一月之后的任何一个月,我必须在每个日期之间按 Enter。
      • @Leaf187 - 抱歉,我确实在代码逻辑上犯了一个错误。我已经修好了。如果您按原样粘贴代码,则不需要您按 Enter。
      • @FernandoMatsumoto - 抱歉,我犯了一个逻辑错误。我已经修好了。
      【解决方案3】:

      谜团是正确的。

      我只需要添加一个功能来显示下个月/根据 Leaf187 要求的用户输入停止程序。

      string userChoice;
      string[] MonthsOfTheYear = new string[] { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
      
      int[] DaysOfTheMonth = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
      
      string[] DaysOfTheWeek = new string[] { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
      var weekdayIndex = 4;
      for (var index = 0; index < MonthsOfTheYear.Length; index++)
      {
          for (var day = 1; day <= DaysOfTheMonth[index]; day++)
          {
              Console.WriteLine(String.Format("{0} {1} {2}", DaysOfTheWeek[weekdayIndex++ % 7], MonthsOfTheYear[index], day));
          }
          Console.Write("Enter any key to display next month. Enter 'e' to exit "); // Ask user to choose an option 
          userChoice = Console.ReadLine();
          if (userChoice == "e" || userChoice == "E")
          {
              // Break the execution
              break;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-06-14
        • 2016-10-30
        • 1970-01-01
        • 1970-01-01
        • 2016-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多