C# 获取最接近值的对

C# get pair closest to value

我有这种情况:

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)
};

如何获得最接近某个值的对?

例如:

备注:

您似乎没有考虑 Max,'closeness' 完全基于 Min。但在此之前,让我们稍微修复一下 class。就像现在一样,您相信最小值和最大值的分配是正确的,但我会在那里添加一个小错误修复。

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;
    }
}

接下来,有多种获取 'closest' 值的方法。我使用的一种方法是使用 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) 对,因为它遍历了整个列表。

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

你想要这样的东西:

    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;
    }