int[] array = new int[5]{5,7,8,15,20};
int TargetNumber = 13;
Run Code Online (Sandbox Code Playgroud)
对于目标号码,我想在数组中找到最接近的数字.例如,当目标数为13时,上面数组中与它最接近的数字是15.如何在C#中以编程方式完成?
Jon*_*eet 60
编辑:已调整下面的查询转换为使用long算术,以便我们避免溢出问题.
我可能会使用MoreLINQ的MinBy方法:
var nearest = array.MinBy(x => Math.Abs((long) x - targetNumber));
Run Code Online (Sandbox Code Playgroud)
或者您可以使用:
var nearest = array.OrderBy(x => Math.Abs((long) x - targetNumber)).First();
Run Code Online (Sandbox Code Playgroud)
...但是这将对整个系列进行排序,这是您真正不需要的.对于一个小数组来说,它不会有太大的区别,不可否认......但与描述你实际上要做的事情相比,它感觉不太正确:根据一些函数找到具有最小值的元素.
请注意,如果数组为空,这两个都将失败,因此您应该首先检查它.
Ric*_*lly 28
如果您使用的是.Net 3.5或更高版本,LINQ可以在这里为您提供帮助:
var closest = array.OrderBy(v => Math.Abs((long)v - targetNumber)).First();
Run Code Online (Sandbox Code Playgroud)
或者,您可以编写自己的扩展方法:
public static int ClosestTo(this IEnumerable<int> collection, int target)
{
// NB Method will return int.MaxValue for a sequence containing no elements.
// Apply any defensive coding here as necessary.
var closest = int.MaxValue;
var minDifference = int.MaxValue;
foreach (var element in collection)
{
var difference = Math.Abs((long)element - target);
if (minDifference > difference)
{
minDifference = (int)difference;
closest = element;
}
}
return closest;
}
Run Code Online (Sandbox Code Playgroud)
可以这样使用:
var closest = array.ClosestTo(targetNumber);
Run Code Online (Sandbox Code Playgroud)
Lee*_*som 17
无论乔恩和丰富了与伟大的答案MinBy和ClosestTo.但OrderBy如果您的意图是找到一个元素,我绝不会建议使用.对于那些类型的任务来说效率太低了.这只是工作的错误工具.
这是一种比MinBy稍微好一点的技术,已经包含在.NET框架中,但不如MinBy优雅: Aggregate
var nearest = array.Aggregate((current, next) => Math.Abs((long)current - targetNumber) < Math.Abs((long)next - targetNumber) ? current : next);
Run Code Online (Sandbox Code Playgroud)
正如我所说,不像Jon的方法那么优雅,但可行.
我的电脑上的表现:
小智 5
几年前,我在 Math.NET Numerics https://numerics.mathdotnet.com/中发现了这种非常性感的方法,它与数组中的 BinarySearch 配合使用。这对于准备插值和 .Net 2.0 的工作很有帮助:
public static int LeftSegmentIndex(double[] array, double t)
{
int index = Array.BinarySearch(array, t);
if (index < 0)
{
index = ~index - 1;
}
return Math.Min(Math.Max(index, 0), array.Length - 2);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37531 次 |
| 最近记录: |