You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中Enumerable.Intersect处理数值范围不符合预期问题排查

问题排查:范围交集判断错误的原因

核心问题:Enumerable.Range的参数理解偏差

Enumerable.Range(start, count)的第二个参数是要生成的元素总数,而非范围的结束值。你的代码中:

  • Enumerable.Range(min1, max1) 传入(64,67)时,实际生成的是从64开始的67个整数,即范围为 64 ~ 64+67-1 = 130
  • Enumerable.Range(min2, max2) 传入(43,63)时,实际生成的是从43开始的63个整数,即范围为 43 ~ 43+63-1 = 105

这两个范围的交集是64~105,因此Intersect会返回非空结果,和你预期的64-67、43-63无交集的情况完全不符。

修正方案

若要生成[min, max]闭区间的整数序列,需计算正确的元素个数:max - min + 1,修改后的代码如下:

public void Challenge2()
{
    List<(Int32 min1, Int32 max1, Int32 min2, Int32 max2)> _numbers = new(){(64, 67, 43, 63)};
    Int32 count = 0;
    foreach ((Int32 min1, Int32 max1, Int32 min2, Int32 max2) in _numbers)
    {
        // 生成[min1, max1]的整数序列
        var range1 = Enumerable.Range(min1, max1 - min1 + 1);
        // 生成[min2, max2]的整数序列
        var range2 = Enumerable.Range(min2, max2 - min2 + 1);
        
        var intersection = range1.Intersect(range2);
        if (intersection.Any())
        {
            count++;
        }
    }
}

更高效的交集判断方式

无需生成完整序列,直接用数学逻辑判断即可,性能更优:

if (min1 <= max2 && min2 <= max1)
{
    count++;
}

该条件的逻辑是:两个区间存在交集的充要条件为,一个区间的最小值不大于另一个区间的最大值,同时另一个区间的最小值也不大于当前区间的最大值。

内容的提问来源于stack exchange,提问作者David Turley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 07:25:23