【问题标题】:C# get pair closest to value [closed]C#获取最接近值的对[关闭]
【发布时间】: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 =&gt; value &lt; x.Min ? x.Min - value : value &gt; x.Max ? value - x.Max : 0 订购并拿走第一个。
  • 有点跑题了,但是您分配最小值和最大值有一个大问题,因为您信任输入。如果有人做了new Pair(15,5); 怎么办?您没有错误检查,因此现在您的 min 实际上将具有较大的值,而 max 将具有较小的值。
  • 请问您能正确定义您的条件吗?您的示例给出了一个模糊的想法,但这不是您的标准。例如,如果 'value' 为 5,为什么返回的对应该是第一个?那是因为第一对的Min 的值最接近它吗?或者我们是否考虑MinMax 来做出这个决定?例如,如果有另一对 (-10,4) 是否会被视为“更接近”?
  • 您仍然没有正确定义您的标准。想想所有的可能性。例如,如果您有另一个类似 (20, 22) 的内容怎么办?那么value=18的选择是什么? 16 和 20 都与 18 相差两个。
  • 您需要在代码中编码所有规则(例如,一对不能有另一对的最小值/最大值,但最小值必须为 Distance 方法来实现您将用于“最近”的距离。一旦你有了它,你只需寻找最小距离。

标签: c# list numbers closest


【解决方案1】:

你想要这样的东西:

    public static Pair FindClosest(IEnumerable<Pair> list, int value)
    {
        Pair closest = null;
        
        if (list != null && list.Count() > 0)
        {
            foreach (var pair in list)
            {
                if (value <= pair.Max)
                {
                    closest = pair;
                    break;
                }
            }

            if (closest == null)
            {
                closest = list.Last();
            }
        }
        
        return closest;
    }

【讨论】:

  • 此方法有一个明显的缺点,即您需要正确的数据才能使此方法起作用。您通过引用Max 间接使用Min 的值,并取决于用户提供无错误的Pair 对象列表,我认为这不是理想的解决方案。
【解决方案2】:

您似乎没有考虑Max,而“亲近度”仅基于Min。但在此之前,让我们稍微修正一下你的课程。就像现在一样,您相信最小值和最大值的分配是正确的,但我会在那里添加一个小错误修复。

public class Pair
{
    public decimal Min { get; set; }
    public decimal Max { get; set; }

    public Pair(decimal min, decimal max)
    {
        if (min > max)
        {
            var temp = min;
            min = max;
            max = temp;
        }

        Min = min;
        Max = max;
    }
}

接下来,有多种方法可以获得“最接近”的值。我使用的一种方法是使用Aggregate() 函数。

pairs.Aggregate((current, next) => Math.Abs(current.Min - value) < Math.Abs(next.Min - value) ? current : next);

但是我必须说你还没有清楚地定义问题。例如,即使考虑到您给定的规则,也请考虑以下配对序列。

var myPairList = new List<Pair>()
{
    new Pair(10, 15),
    new Pair(16, 19),
    new Pair(20, 23),
    new Pair(25, 30)
};

考虑value = 18。上面的序列不违反您的任何规则,但有两个Min 值同样接近18。你需要选择哪一个?

我给出的解决方案将选择 (20, 23) 对,因为它会遍历整个列表。

基本上,您的解决方案取决于您如何定义标准,而您还没有这样做。

【讨论】:

  • 如果值为 18,那么它应该选择 (16, 19),因为 18 更接近于第二对的最大值而不是第三对的最小值。 @Eddy 的答案返回正确的一对。
  • 正如我一开始所说的,您应该完全首先定义选择元素的标准,然后然后发布问题。您似乎只是在我们进行过程中添加标准,这没有帮助。另一个答案有一个严重的缺点,即依赖于正确的数据,这在编程方面不是一个好主意。
  • @Sach 如果您觉得问题没有处于可以回答的状态,那您为什么要发布问题的答案?
猜你喜欢
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 2022-01-25
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多