C# 给出了未来的一天和天数。返回前几天的星期几

C# 给出了未来的一天和天数。返回前几天的星期几,c#,C#,我正在尝试编写一段代码,其中给出了一天和几天的时间,例如,(3月3日,星期一) 这应该返回“星期四”,因为从星期一开始的3天是星期四 这就是我所做的。问题是,如果要求(星期四,5)或(星期三,7)或(星期五,2),它将无法返回任何东西 如您所见,我正在使用数组的索引来获得结果。我不确定我需要如何修改代码以获得,例如,从星期五开始的第10天 using System; namespace ConsoleApp2 { class Program { static v

我正在尝试编写一段代码,其中给出了一天和几天的时间,例如,(3月3日,星期一)

这应该返回“星期四”,因为从星期一开始的3天是星期四

这就是我所做的。问题是,如果要求(星期四,5)或(星期三,7)或(星期五,2),它将无法返回任何东西

如您所见,我正在使用数组的索引来获得结果。我不确定我需要如何修改代码以获得,例如,从星期五开始的第10天

using System;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            string Day = "Friday";
            int ahead = 3;
            Console.WriteLine(FindDay(Day, ahead));
        }
        public static string FindDay(string dayGiven, int daysAhead) 
        {
            string[] week = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
            int indexOfDayGiven = 0;
            string ans = "";
            foreach (string day in week)
            {
                if (day == dayGiven)
                {
                    indexOfDayGiven = Array.IndexOf(week, dayGiven);

                }
                
            }
            foreach(string day in week)
        
            {
                if (Array.IndexOf(week, day) ==indexOfDayGiven + daysAhead)
                {
                    ans = day;
                }
            }
            return ans;
        }
    }
}

最好的方法是使用c#中的
%
操作。 大概是这样的:

var ind = (indexOfDayGiven + daysAhead) % 7;
我将使用如下示例中的枚举。找到当天的方法与评论和其他答案中的方法相同:使用

使用系统;
利用制度全球化;
公共课程
{
公共静态void Main()
{
int n=8;
对于(int startDay=0;startDay<7;startDay++)
WriteLine({1}的{0}天为{2}),n,GetDayName((DayOfWeek)startDay),GetDayName(getDaysHead((DayOfWeek)startDay,n));
}
公共静态字符串GetDayName(DayOfWeek-day)
{
返回日期TimeFormatInfo.CurrentInfo.GetDayName(天);
}
公共静态DayOfWeek GetDaysHead(DayOfWeek开始,int DaysHead)
{
如果(daysAhead<0)抛出新ArgumentOutOfRangeException(nameof(daysAhead));
如果(dayshead==0)返回开始;
返回(DayOfWeek)(((int)开始+日头)%7);
}
}

DayOfWeek
DateTime
DateTimeOffset
的属性。它本身不是本地化的,但是您可以很容易地获得如上所示的本地化字符串。

正如其他人所提到的,您可以使用模运算符(它返回除法后的余数)来获取数组中的值。因此,如果您有
Friday
5
)并且想知道哪一天是
4
天,我们将这两天相加,然后取数组中项目数的模(
5+4=9;9%7=2;
),或者在一行中:
((5+4)%7)=2
,这是我们结果的索引:

int result = week[(Array.IndexOf(week, "Friday") + 4) % 7];
我们还可以使用
DayOfWeek
enum,而不是创建一个日期名称数组。这允许我们对输入日字符串进行不区分大小写的解析,以获取枚举值。这样做的好处是,枚举在一个对象中同时包含
名称
索引
,因此我们不必查找索引-我们只需将其转换为
int
,进行计算,然后将结果转换回
DayOfWeek
,并获得字符串结果:

public static string FindDay(string dayGiven, int daysAhead)
{
    DayOfWeek startDay;

    if (!Enum.TryParse(dayGiven, true, out startDay))
    {
        throw new ArgumentException($"'{dayGiven}' is not a valid day.");
    }

    return ((DayOfWeek) (((int) startDay + daysAhead) % 7)).ToString();            
}            

indexof+days模7?注意,这里有一个枚举,你可能想利用它来实现这个?另一点:如果希望
dayshead
具有正值,那么您应该防止负值(不要相信用户输入)。使用
indexOfDayGiven=Array.IndexOf(week)
而不使用
dayGiven
我实际上建议返回
DayOfWeek
值,任何调用该方法的人都可以将其本地化(参见我的答案)。我确实意识到,问题也只是英语。仅供参考。
public static string FindDay(string dayGiven, int daysAhead)
{
    DayOfWeek startDay;

    if (!Enum.TryParse(dayGiven, true, out startDay))
    {
        throw new ArgumentException($"'{dayGiven}' is not a valid day.");
    }

    return ((DayOfWeek) (((int) startDay + daysAhead) % 7)).ToString();            
}