【问题标题】:how to dynamically create array of a week days in C#?如何在 C# 中动态创建一周的数组?
【发布时间】:2018-10-10 12:31:15
【问题描述】:

而不是指定 "string[] week_Days = {"星期一", "星期二"...};"

如何将天数动态设置为数组?

我尝试解决它,但无法将开始日期设为“星期日”-

DateTime days = DateTime.Now;  
string[] weekDays = new string[7];  
for (int i = 0; i < weekDays.Length; i++)  
  {  
    weekDays[i] = string.Format("{0:dddd}", days.AddDays(i));  
    Console.WriteLine(weekDays[i]);     
    days = DateTime.Now;  
  }

输出 -

Wednesday  
Thursday  
Friday  
Saturday  
Sunday  
Monday  
Tuesday

【问题讨论】:

  • CultureInfo.CurrentCulture.DateTimeFormat.DayNames ?
  • 这段代码的完整结果是什么?
  • 这不起作用,因为您从今天的 DateTime 开始
  • 不,没有自动的方法可以做到这一点。是的,使用 DayOfWeek 枚举。不,没有从星期一开始的自动方式。是的,只是new[]{ DayOfWeek.Monday, DayOfWeek.Tuesday,等等等等等等

标签: c# .net


【解决方案1】:
using System;
using System.Globalization;

static void Main()
{
    string[] weekDays = new CultureInfo("en-us").DateTimeFormat.DayNames;
    for (int i = 1; i <= 7; i++)
        Console.WriteLine(weekDays[i % 7]);
}

【讨论】:

  • 你为什么用weekDays[i % 7]而不是i
  • 为了避免异常,一周中的日子是周一到周日。在数组中,第一个元素是星期日。
  • 啊我明白了.. 它返回 1, 2, 3, 4, 5, 6, 0
  • weekDays[1] => "星期一" weekDays[0] => "星期日"
【解决方案2】:

您可以使用DayOfWeek 枚举:

string[] weekdays = Enum.GetNames(typeof(DayOfWeek));

编辑:如果您需要更改一周的开始日期:

private static string[] GetWeekdays(DayOfWeek firstDayOfWeek)
{
    string[] weekdays = new string[7];
    DateTime dateTime = DateTime.Now;
    while (dateTime.DayOfWeek != firstDayOfWeek)
    {
        // Find the next date with start day of week
        dateTime = dateTime.AddDays(1); 
    }
    for (int i = 0; i < 7; i++)
    {
        // Get day of week of current day, add 1 day, iterate 7 times.
        weekdays[i] = dateTime.DayOfWeek.ToString();
        dateTime = dateTime.AddDays(1);
    }
    return weekdays;
}

【讨论】:

  • 是的,它可以工作,但是如果我想将开始日期设置为“星期一”呢?
【解决方案3】:

您可以使用此 LINQ 查询。唯一的挑战是获得正确的顺序:

DayOfWeek firstWeekDay = DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek;
string[] weekDays = Enum.GetValues(typeof(DayOfWeek)).Cast<DayOfWeek>()
   .OrderBy(dow => dow < firstWeekDay ? 7-(int)dow : dow-firstWeekDay)
   .Select(dow => dow.ToString())
   .ToArray();

也许有人有比这个OrderBy更优雅的方式。

【讨论】:

  • 为什么不只是 Enum.GetNames?
  • @Adrian:因为 OP 想要正确的顺序而不是从星期日开始。我假设正确的顺序是通过DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek 定义的,对我来说是Monday
  • 嗯,这取决于文化。有些文化从星期日开始......
【解决方案4】:
string[] week_Days = new string[7];  
DayOfWeek day = DayOfWeek.Sunday;  
for (int i = 0; i < week_Days.Length; i++)  
 {  
    week_Days[i] = day.ToString();  
    Console.WriteLine(week_Days[i]);  
    day++;  
 }  

使用 DayOfWeek,而不是分配 DateTime 属性。它可以轻松解决问题。

【讨论】:

  • @NaveenKumar 您在此处选择的奇怪解决方案-您对不同答案的评论也适用于此处What if i want to set starting day as "Monday"?-使用此解决方案您也无法指定 Monday 开始-数组中的最后一个条目如果你想说DayOfWeek day = DayOfWeek.Monday;,就会简单地输出7
  • @Rand Random 是的,刚才注意到了。当 DayOfWeek 超出范围时,它会返回数字。
【解决方案5】:

您的代码失败,因为 DateTime.Now 并不总是在星期天:

DateTime days = DateTime.Now;  

最好使用现有的DayOfWeek 枚举:

 string[] weekdays = Enum.GetNames(typeof(DayOfWeek));

【讨论】:

  • 如果我想将开始日期设置为“星期一”怎么办?
【解决方案6】:

这也可以通过这种方式完成。在您获得“星期一”之前,将日期添加到 DateTime.Now。

int j = 0;
string[] weekDays = new string[7];
DateTime days = DateTime.Now;

while (weekDays[0] != "Sunday")
{ 
    days = days.AddDays(j++);
    weekDays[0] = string.Format("{0:dddd}", days);
    if (weekDays[0] != "Sunday")
       days = DateTime.Now;  
}

for (int i = 0; i < weekDays.Length; i++)
{
    weekDays[i] = string.Format("{0:dddd}", days.AddDays(i));
    Console.WriteLine(weekDays[i]);   
}

【讨论】:

  • 有一个解决方案。复杂性……复杂性……
猜你喜欢
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多