【发布时间】:2020-11-18 06:09:50
【问题描述】:
我有这种情况:
public class Pair
{
public decimal Min { get; set; }
public decimal Max { get; set; }
public Pair(decimal min, decimal max)
{
Min = min;
Max = max;
}
}
public List<Pair> MyPairList = new List<Pair>()
{
new Pair(10, 15),
new Pair(16, 20),
new Pair(21, 30)
};
如何获得最接近某个值的对?
例如:
- 如果值为5,则返回的对应该是第一个(因为5最接近第一对的最小值)
- 如果值为40,则返回的对应该是最后一个(因为40是最接近最后一个对的最大值的值)
- 如果值为18,则返回的对应该是第二个(因为18在第二对之间)
注意事项:
- 一对不得有来自另一对的最小值/最大值(例如:(15,20) 和 (20, 25))
- 一个对的最小值不得低于其先前对的最大值。 (例如:(98, 105) 和 (102, 200))
【问题讨论】:
-
如果您不需要担心重叠,那么只需在
x => value < x.Min ? x.Min - value : value > x.Max ? value - x.Max : 0订购并拿走第一个。 -
有点跑题了,但是您分配最小值和最大值有一个大问题,因为您信任输入。如果有人做了
new Pair(15,5);怎么办?您没有错误检查,因此现在您的 min 实际上将具有较大的值,而 max 将具有较小的值。 -
请问您能正确定义您的条件吗?您的示例给出了一个模糊的想法,但这不是您的标准。例如,如果 'value' 为 5,为什么返回的对应该是第一个?那是因为第一对的
Min的值最接近它吗?或者我们是否考虑Min和Max来做出这个决定?例如,如果有另一对 (-10,4) 是否会被视为“更接近”? -
您仍然没有正确定义您的标准。想想所有的可能性。例如,如果您有另一个类似 (20, 22) 的内容怎么办?那么
value=18的选择是什么? 16 和 20 都与 18 相差两个。 -
您需要在代码中编码所有规则(例如,一对不能有另一对的最小值/最大值,但最小值必须为 Distance 方法来实现您将用于“最近”的距离。一旦你有了它,你只需寻找最小距离。