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)
};
如何获得最接近某个值的对?
例如:
- 如果值为5,则返回的对应该是第一个(因为5最接近第一对)
- 如果值为40,则返回的对应该是最后一个(因为40是最接近Max值的值最后一对)
- 如果值为18,则返回的对应该是第二对(因为18在第二对之间)
备注:
- 一对不能有来自另一对的 Min/Max 值(例如:(15,20) 和 (20, 25))
- 一对的最小值不得低于其前一对的最大值。 (例如:(98, 105) 和 (102, 200))
您似乎没有考虑 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;
}
我有这种情况:
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是最接近Max值的值最后一对)
- 如果值为18,则返回的对应该是第二对(因为18在第二对之间)
备注:
- 一对不能有来自另一对的 Min/Max 值(例如:(15,20) 和 (20, 25))
- 一对的最小值不得低于其前一对的最大值。 (例如:(98, 105) 和 (102, 200))
您似乎没有考虑 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;
}