C#中如何用Linq筛选含可空DateOnly的Range列表?
筛选指定日期区间内的Range对象
针对你的Range类(end为可空类型,代表开放区间),可以通过Where()方法结合对end的空值判断完成筛选,核心是区分**闭合区间(end有值)和开放区间(end为null)**两种场景,以下分两种常见需求给出实现:
需求1:筛选完全包含在[from, to]内的Range
即Range的所有日期范围都落在指定区间内,此时开放区间(无结束日期)无法满足该条件,筛选逻辑为:
- Range的起始日期
begin不早于指定区间的from - Range的结束日期
end必须有值,且不晚于指定区间的to
代码实现:
DateOnly targetFrom = /* 你的目标起始日期 */; DateOnly targetTo = /* 你的目标结束日期 */; var fullyContainedRanges = yourRangeList.Where(range => range.begin >= targetFrom && range.end.HasValue && range.end.Value <= targetTo);
需求2:筛选与[from, to]存在交集的Range
即Range和指定区间只要有重叠部分就保留,这是更常用的场景,筛选逻辑为:
- 若为开放区间(
end为null):只要Range的起始日期begin不晚于指定区间的to,就存在交集 - 若为闭合区间(
end有值):需满足Range的起始日期不晚于指定区间的to,且Range的结束日期不早于指定区间的from
代码实现:
DateOnly targetFrom = /* 你的目标起始日期 */; DateOnly targetTo = /* 你的目标结束日期 */; var overlappingRanges = yourRangeList.Where(range => (!range.end.HasValue && range.begin <= targetTo) || (range.end.HasValue && range.begin <= targetTo && range.end.Value >= targetFrom));
内容的提问来源于stack exchange,提问作者L. Kvri
相关产品推荐
相关产品推荐

