我看到了一些我很难理解的行为。给定一个 DateTime
列表,我只想按降序选择去年发生的日期。但是使用 OrderBy()
、OrderByDescending()
和 SkipWhile()
的行为……很奇怪。给定一个从今天开始的列表,包括像这样的过去 100 个月:
List<DateTime> ldt = new List<DateTime>();
for (int i = 0; i < 100; i++)
{
ldt.Add(DateTime.Now.AddMonths(-i));
}
我从以下代码开始:
ldt = ldt.OrderByDescending(date => date).
SkipWhile(date => date <= DateTime.Now.AddYears(-1)).ToList();
这对列表进行了正确排序,但不会跳过任何记录。所以为了好玩,我尝试了这个(跳过今天之前的所有内容,即所有内容):
ldt = ldt.OrderByDescending(date => date).
SkipWhile(date => date <= DateTime.Now).ToList();
哪个有效。该列表为空。然后我尝试了以下(OrderBy 而不是 OrderByDescending):
ldt = ldt.OrderBy(date => date).
SkipWhile(date => date <= DateTime.Now.AddYears(-1)).ToList();
这完全符合预期 - 列表已排序,日期已正确过滤。所以最终的结果是:
ldt = ldt.OrderBy(date => date).
SkipWhile(date => date <= DateTime.Now.AddYears(-1)).ToList();
ldt = ldt.OrderByDescending(date => date).ToList();
跳过,然后重新排序。那我错过了什么?为什么其中一些有效,而另一些却以不可预知的方式中断?对于我要执行的操作,什么是正确的一行命令?
最佳答案
基本上,您需要 TakeWhile
而不是 SkipWhile
:
ldt = ldt.OrderByDescending(date => date)
.TakeWhile(date => date > DateTime.Now)
.ToList();
在您使用 OrderByDescending
之后,您要保留的条目是第一个...而 SkipWhile
假设您想要丢弃一些条目,然后保留其余的。
(或者您可以使用 Where
进行过滤,然后按照 Reed 的建议进行排序。两者都可以工作 Reed 的可能更有效。使用您认为更容易理解的任何一个。)
当您对这样的事情感到困惑时,有时值得在一张纸上写下数据示例。计算出每一步之后的序列是什么样的,然后下一步会做什么。
关于c# - OrderBy [ Descending ]() 和 SkipWhile() 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16824031/