C#找数组中最接近的值int[]array=newint[5]{5,7,8,15,20};intTargetNumber=13;对于目标数字,我想找到数组中最接近的数字。例如,当目标数字是13时,上面数组中最接近它的数字是15。这如何在C#中以编程方式完成?编辑:调整下面查询的转换以使用长算术,这样我们就可以避免溢出问题。我可能会使用MoreLINQ的MinBy方法:varnearest=array.MinBy(x=>Math.Abs??((long)x-targetNumber));或者您可以使用:varnearest=array.OrderBy(x=>Math.Abs??((long)x-targetNumber)).First();...但这将对整个系列进行排序,而您并不真正需要它。对于一个小数组,这并没有太大的区别,诚然......但与描述你实际尝试做的事情相比,它感觉不太正确:根据某个函数找到具有最小值的元素。请注意,如果数组为空,这两者都会失败,因此您应该先检查一下。如果您使用的是.Net3.5或更高版本,LINQ可以在此处为您提供帮助:varclosest=array.OrderBy(v=>Math.Abs??((long)v-targetNumber)).First();或者,您可以编写自己的扩展方法:publicstaticintClosestTo(thisIEnumerablecollection,inttarget){//NB方法将为不包含任何元素的序列返回int.MaxValue。//根据需要在此处应用任何防御性编码。varclosest=int.MaxValue;varminDifference=int.MaxValue;foreach(集合中的var元素){vardifference=Math.Abs??((long)element-target);if(minDifference>difference){minDifference=(int)difference;最近=元素;}}返回最近;可以这样使用:varclosest=array.ClosestTo(targetNumber);Jon和Rich对MinBy和ClosestTo都有很好的答案。但如果您的目的是查找元素,我绝不会推荐使用OrderBy。对于这些类型的任务来说效率太低了。这只是工作的错误工具。这是一种比MinBy稍微好一点的技术,已经包含在.NET框架中,但不如MinBy优雅:Aggregatevarnearest=array.Aggregate((current,next)=>Math.Abs??((long)current-targetNumber)正如我所说,虽然不如Jon的方法优雅,但确实有效。我电脑上的性能:For(each)loop=fastestAggregate=2.5xslowerthanloopMinBy=3.5xslowerthanloopOrderBy=12xslowerthanloop几年前我在Math.NETNumericshttps://发现这个非常numerics.mathdotnet.com/上的性感方法,它与数组上的BinarySearch一起使用。对准备插值和升级到.Net2.0有很大帮助:if(indexperformancewiseCustomcodewillbemoreuseful.以上是C#学习教程:C#查找数组中最接近的值所有内容分享,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注--publicstaticintFindNearest(inttargetNumber,IEnumerablecollection){varresults=collection.ToArray();intnearestValue;if(results.Any(ab=>ab==targetNumber))nearestValue=results.FirstOrDefault(i=>i==targetNumber);else{intgreaterThanTarget=0;intlessThanTarget=0;if(results.Any(ab=>ab>targetNumber)){greaterThanTarget=results.Where(i=>i>targetNumber).Min();}if(results.Any(ab=>abi本文摘自网络,不代表立场,如涉及侵权,请点击右侧联系管理员删除,如有转载请注明出处:
