Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从日期列表中获取时间间隔范围_C#_Asp.net - Fatal编程技术网

C# 从日期列表中获取时间间隔范围

C# 从日期列表中获取时间间隔范围,c#,asp.net,C#,Asp.net,我当前希望从日期列表中获取日期范围(时间范围之间) 例如: 现在是时候了 2017-04-08 18:00 我从日期和日期得到了这些: public static string[] fromDates = new string[] { "2017-04-07 07:00", "2017-04-07 10:00", "2017-04-07 12:00", "2017-04-07 14:00", "2017-04-07 16:00" }; public static string[] toDates

我当前希望从日期列表中获取日期范围(时间范围之间)

例如:

现在是时候了

2017-04-08 18:00

我从日期和日期得到了这些:

public static string[] fromDates = new string[] { "2017-04-07 07:00", "2017-04-07 10:00", "2017-04-07 12:00", "2017-04-07 14:00", "2017-04-07 16:00" };
public static string[] toDates = new string[] { "2017-04-07 08:00", "2017-04-07 11:00", "2017-04-07 13:00", "2017-04-07 15:00", "2017-04-07 17:00" };
我正在使用以下代码:

public static bool IsInRange(this DateTime dateToCheck, string[] startDates, string[] endDates, out string StartDate, out string EndDate)
    {
        DateTime startDate = new DateTime();
        DateTime endDate = new DateTime();

        bool isWithinRange = false;

        for (int i = 0; i < startDates.Length; i++)
        {
            startDate = Convert.ToDateTime(startDates[i]);

            isWithinRange = dateToCheck >= startDate;

            if (isWithinRange)
                break;
        }

        for (int y = 0; y < endDates.Length; y++)
        {
            endDate = Convert.ToDateTime(endDates[y]);

            isWithinRange = dateToCheck < endDate;

            if (isWithinRange)
                break;
        }

        StartDate = startDate;
        EndDate = endDate;

        return isWithinRange;
    }
但是我无法让它工作,在
IsInRange
方法中的
StartDate
总是返回true,它将从
fromDates
变量返回第一个索引,这是错误的

我怎样才能让这段时间像是在两人之间

我知道我可以这样做:

var isBetween = Convert.ToDateTime("2017-04-08 18:00").IsInRange(fromDates, toDates, out StartDate, out EndDate)
var isBetween = dateToCheck >= startDate && dateToCheck < endDate
public DateTimeRange FindRange(IEnumerable<DateTimeRange> ranges, DateTime value) =>
    ranges.FirstOrDefault(range => range.Contains(value));
var isBetween=dateToCheck>=startDate&&dateToCheck
但这只是一个日期需要检查,如果它是像我的情况呢

非常感谢你的回答


谢谢

我将首先将所有内容转换为更有用的对象模型:

  • 去掉所有字符串(即,从字符串转换为早期更有用的字符串)
  • 不要有两个集合,而是创建一个指示“日期/时间范围”的新类型。将错误的项目关联在一起会使您有些挫败:开始值彼此无关,它们与相应的结束日期相关
如果确实需要的话,您可以在方法中这样做,但是最好是尽可能多地使用更丰富的对象模型。例如,假设您有:

public sealed class DateTimeRange
{
    public DateTime Start { get; }
    public DateTime End { get; }

    public DateTimeRange(DateTime start, DateTime end)
    {
        // TODO: Validate that start <= end
        Start = start;
        End = end;
    }

    public bool Contains(DateTime value) => Start <= value && value < End;
}
公共密封类日期时间范围
{
公共日期时间开始{get;}
公共日期时间结束{get;}
公共日期时间范围(日期时间开始、日期时间结束)
{
//TODO:验证该开始
ranges.FirstOrDefault(range=>range.Contains(value));
如果没有范围包含值,则返回
null
,否则返回第一个包含值的范围


(顺便说一句,我想把所有这些都作为一个更好的日期/时间API来做,但我有偏见。)

我会首先将所有内容转换成一个更有用的对象模型:

  • 去掉所有字符串(即,从字符串转换为早期更有用的字符串)
  • 不要有两个集合,而是创建一个指示“日期/时间范围”的新类型。通过将错误的项关联在一起,您会遇到一些困难:开始值彼此不相关,它们与相应的结束日期相关
如果确实需要,可以在方法中执行此操作,但最好尽可能多地使用更丰富的对象模型来处理代码。例如,假设您有:

public sealed class DateTimeRange
{
    public DateTime Start { get; }
    public DateTime End { get; }

    public DateTimeRange(DateTime start, DateTime end)
    {
        // TODO: Validate that start <= end
        Start = start;
        End = end;
    }

    public bool Contains(DateTime value) => Start <= value && value < End;
}
公共密封类日期时间范围
{
公共日期时间开始{get;}
公共日期时间结束{get;}
公共日期时间范围(日期时间开始、日期时间结束)
{
//TODO:验证该开始
ranges.FirstOrDefault(range=>range.Contains(value));
如果没有范围包含值,则返回
null
,否则返回第一个包含值的范围


(顺便说一句,我想把所有这些都作为一个更好的日期/时间API来做,但我有偏见。)

如果你想继续使用yoir设计,那么你应该在一个循环内做所有事情,而不是做两次,因为你总是想将第一个元素与第一个元素匹配,第二个与第二个元素匹配,等等

public static bool IsInRange(this DateTime dateToCheck, string[] startDates, string[] endDates, out DateTime StartDate, out DateTime EndDate)
    {
        if (startDates.Length != endDates.Length)
        {
            throw new ArgumentException("The arrays must have the same length");
        }
        StartDate = new DateTime();
        EndDate = new DateTime();

        for (int i = 0; i < startDates.Length; i++)
        {
            StartDate = Convert.ToDateTime(startDates[i]);
            EndDate = Convert.ToDateTime(endDates[i]);

            if (dateToCheck >= StartDate && dateToCheck <= EndDate)
            {
                return true;
            }
        }

        return false;
    }
public static bool IsInRange(此DateTime dateToCheck,字符串[]StartDate,字符串[]endDates,out DateTime StartDate,out DateTime EndDate)
{
if(startDates.Length!=endDates.Length)
{
抛出新ArgumentException(“数组必须具有相同的长度”);
}
StartDate=新的日期时间();
EndDate=新的日期时间();
对于(int i=0;i如果(dateToCheck>=StartDate&&dateToCheck如果您想继续使用yoir设计,那么您应该在一个循环中完成所有操作,而不是重复两次,因为您希望始终将第一个元素与第一个元素匹配,第二个与第二个元素匹配,等等

public static bool IsInRange(this DateTime dateToCheck, string[] startDates, string[] endDates, out DateTime StartDate, out DateTime EndDate)
    {
        if (startDates.Length != endDates.Length)
        {
            throw new ArgumentException("The arrays must have the same length");
        }
        StartDate = new DateTime();
        EndDate = new DateTime();

        for (int i = 0; i < startDates.Length; i++)
        {
            StartDate = Convert.ToDateTime(startDates[i]);
            EndDate = Convert.ToDateTime(endDates[i]);

            if (dateToCheck >= StartDate && dateToCheck <= EndDate)
            {
                return true;
            }
        }

        return false;
    }
public static bool IsInRange(此DateTime dateToCheck,字符串[]StartDate,字符串[]endDates,out DateTime StartDate,out DateTime EndDate)
{
if(startDates.Length!=endDates.Length)
{
抛出新ArgumentException(“数组必须具有相同的长度”);
}
StartDate=新的日期时间();
EndDate=新的日期时间();
对于(int i=0;i如果(dateToCheck>=StartDate&&dateToCheck我正要发布这些准确的更改:)感谢您的回答和建议@Pawel Gradecki,我想接受您的两个答案,但它们(stackoverflow)不允许我这样做:)。将尝试Jon Skeet的建议和您的建议,重新设计我的代码。请注意,代码目前不会编译,
return
语句需要在循环之后。我建议您根本不需要
isWithinRange
,只需返回
true
,而不是
break
语句,
>return false
如果你到达循环的末尾。@JonSkeet yes我在修复格式时弄错了一些东西:/显然,循环后必须是return语句。我现在修复了代码。我正要发布这些精确的更改:)谢谢你的回答和建议@Pawel Gradecki,我想接受你的两个答案,但它们都是错误的are(堆栈溢出)不允许我这样做:)。将尝试Jon Skeet的建议和你关于重新设计我的代码的建议。请注意,代码目前不会编译,
return
语句需要在循环之后。我建议你根本不需要
isWithinRange
,你只需返回
true
,而不是
break语句和