c# – 如何使用Linq获取不在一段时间内的前两个连续日期时间点?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何使用Linq获取不在一段时间内的前两个连续日期时间点?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1976字,纯文字阅读大概需要3分钟。
内容图文
![c# – 如何使用Linq获取不在一段时间内的前两个连续日期时间点?](/upload/InfoBanner/zyjiaocheng/762/db86f3373f8b435680f81a299494a7c2.jpg)
我有一个日期时间值列表.我想获得前两个连续的日期时间值
使用Linq驻留在时间范围之外.我不知道该怎么做.
示例数据(可以复制到LinqPad:
List<DateTime> list = new List<DateTime>
{
DateTime.Parse("07/08/2014 01:00 AM"), DateTime.Parse("07/08/2014 02:00 AM"),
DateTime.Parse("07/08/2014 03:00 AM"),DateTime.Parse("07/08/2014 04:00 AM"),DateTime.Parse("07/08/2014 05:00 AM"),
};
DateTime blackoutStartTime = DateTime.Parse("07/08/2014 02:00 AM");
DateTime blackoutEndTime = DateTime.Parse("07/08/2014 03:00 AM");
我试过这个是错的:
var twoHours = list.Where(e => e <= blackoutStartTime || e >= blackoutEndTime)
.Take(2);
我期待结果是最后两个小时,凌晨4点和凌晨5点.在任何示例中,两个小时应该在停电时间范围之前(如果有至少两个小时)或在停电时间范围之后(如此处的示例).
解决方法:
它不是非常高效也不是非常易读,但您可以在单个查询中执行此操作(请参阅底部的有效解决方案):
var twoHours = list.Where(d => d < blackoutStartTime || blackoutEndTime < d)
.OrderBy(d => d) // if sequence is not ordered
.GroupBy(d => blackoutEndTime < d)
.OrderBy(g => g.Key)
.Select(g => g.Take(2))
.Where(g => g.Count() == 2)
.SelectMany(g => g)
.Take(2);
输出:
7/8/2014 04:00:00
7/8/2014 05:00:00
说明:
>筛选出不在范围内的日期 – 我们不需要它们
>将所有日期分为两组 – 日期小于范围,日期大于范围
>订购两组,以便将较小的日期组放在第一位
>仅从每个组中选择前两个日期
>选择至少有两个约会的团体
>项目过滤结果为平坦的日期序列
>如果有的话,选择前两个
更有效的方法(如果序列被排序,否则你应该在查询之前对它进行排序) – Jim Mischel的一点改进建议(为了更好的可读性,我会采用两种查询方式):
var twoHours = list.TakeWhile(d => d < blackoutStartTime).Take(2).ToList();
if (twoHours.Count < 2)
twoHours = list.SkipWhile(d => d <= blackoutEndTime).Take(2).ToList();
改进了什么 – 您不需要将每个查询结果保存到列表中.这将枚举所有匹配条件的项目并在内存中创建新列表.如果你在范围之前有很多项目,或者你在范围之前有少于两个项目而在范围之后有很多项目 – 这不是你想要的.因此,只需要前两项并将它们保存到列表中.在理想世界中,您只会枚举前两个项目.如果没有,那么你将枚举所有项目,直到范围结束2.
内容总结
以上是互联网集市为您收集整理的c# – 如何使用Linq获取不在一段时间内的前两个连续日期时间点?全部内容,希望文章能够帮你解决c# – 如何使用Linq获取不在一段时间内的前两个连续日期时间点?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。