C#中Enumerable.Intersect处理数值范围不符合预期问题排查
问题排查:范围交集判断错误的原因
核心问题:Enumerable.Range的参数理解偏差
Enumerable.Range(start, count)的第二个参数是要生成的元素总数,而非范围的结束值。你的代码中:
Enumerable.Range(min1, max1)传入(64,67)时,实际生成的是从64开始的67个整数,即范围为64 ~ 64+67-1 = 130Enumerable.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
相关产品推荐
相关产品推荐

