Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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#_Date - Fatal编程技术网

C# 在输入日期之前的列表中查找最近日期

C# 在输入日期之前的列表中查找最近日期,c#,date,C#,Date,我发现这段代码用于查找日期范围中最近的日期 var inputDate = UserInputDate; List<DateTime> allDates = new List<DateTime>(); allDates.add(date1); allDates.add(date2); allDates.add(date3); var closestDate = inputDate >= allDates.Last()

我发现这段代码用于查找日期范围中最近的日期

    var inputDate = UserInputDate;
    List<DateTime> allDates = new List<DateTime>();
    allDates.add(date1);
    allDates.add(date2);
    allDates.add(date3);

    var closestDate = inputDate >= allDates.Last()
        ? allDates.Last()
        : inputDate <= allDates.First()
            ? allDates.First()
            : allDates.First(d => d >= inputDate);
var-inputDate=UserInputDate;
List allDates=新列表();
所有日期。添加(日期1);
所有日期。添加(日期2);
所有日期。添加(日期3);
var closestDate=inputDate>=allDates.Last()
? allDates.Last()
:inputDate d>=inputDate);
但是,此代码查找输入日期之后的最近日期

我需要的是输入日期之前最接近的日期

我真的不理解这个代码和
我尝试将>=更改为,我将通过构建一个包含所有小于输入日期的项目的筛选列表,然后取最大值:

var closestDate = allDates.Where(x => x < inputDate).DefaultIfEmpty().Max();
但是,如果
allDates
在内存中已按顺序排序,则您只需执行以下操作:

var closestDate = allDates.TakeWhile(x => x < inputDate).Last();
var closestDate=allDates.TakeWhile(x=>x
TakeWhile
也将选择小于
inputDate
的元素,但在找到较大的元素后停止。(如果对其进行预分类,则这是有意义的。)


同样,要处理空列表,您可以使用
LastOrDefault
或与上述相同的
任何
模式。

按降序排列,然后选择符合条件的第一个:

var closest = allDates.OrderByDescending(x => x).First(x => x <= inputDate);

var-closest=allDates.OrderByDescending(x=>x)。首先(x=>x如果列表已排序,则可以使用返回

如果找到项,则排序列表中项的从零开始的索引;否则,为负数,它是大于项的下一个元素索引的位补码,如果没有较大的元素,则为计数的位补码

否则,如果输入日期低于第一项,则取第一项

: inputDate <= allDates.First()
    ? allDates.First()
如果你想从你的问题中倒转逻辑,你需要最后一行接受最后一个比你的输入少的项目。请注意,这仍然保留在正在排序的列表中:

var closestDate = inputDate >= allDates.Last()
    ? allDates.Last()
    : inputDate <= allDates.First()
        ? allDates.First()
        : allDates.Last(d => d <= inputDate);
var closestDate=inputDate>=allDates.Last()
?所有日期。最后()

:inputDate d为了工作,这段代码似乎需要对列表进行排序。但是,假设它没有预排序,现在对它进行排序就没有意义了。排序将花费大量开销,而实际上是创建一个最大长度为1的排序优先级队列。对列表进行排序只是为了选择一个,效率非常低。不值得一试WNPOW虽然IMHO。在这个问题上没有提到效率,除非OP正在进行一个大规模的列表,它是可以协商的,虽然当然值得注意。我大卫,不确定你是否会看到这一点,但是我在使用这个代码时遇到了一个问题。对于所有日期,如果我添加,让我们说4 10 15 20。最接近的日期是在4号。代码somehow崩溃
var closestDate = inputDate >= allDates.Last()
? allDates.Last()
: inputDate <= allDates.First()
    ? allDates.First()
: allDates.First(d => d >= inputDate);
var closestDate = inputDate >= allDates.Last()
    ? allDates.Last()
    : inputDate <= allDates.First()
        ? allDates.First()
        : allDates.Last(d => d <= inputDate);