C# – 从十进制数组中查找最接近的索引

前端之家收集整理的这篇文章主要介绍了C# – 从十进制数组中查找最接近的索引前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
decimal[] array = new decimal[5]{80.23,60.20,88.01,77.00,20.45};

decimal TargetNumber = 70.40;

这里,最近的值是77.00,如何找到最接近的十进制数组的索引?

注意:它应该保持与我需要的最接近值的精确索引相同的顺序.在这里,指数比价值重要

解决方法

关于使用LINQ做很多事情的一个好处是,如果找到完全匹配,你可以提前停止检查. minIndex保存索引,如果数组为空,则保持-1.
decimal minDistance = 0; //0 is fine here it is never read,it is just to make the compiler happy.
int minIndex = -1;

for(int i = 0; i < array.Length; i++)
{
    var distance = Math.Abs(TargetNumber - array[i]);
    if(minIndex == -1 || distance < minDistance)
    {
        minDistance = distance;
        minIndex = i;

        //Optional,stop testing if we find a exact match.
        if(minDistance == 0)
            break;
    }
}

为了好玩,我制作了一个完全通用的版本,它要求你传入一个委托来计算距离因子,它还有一个可选参数来定义停止检查更多结果所需的“最小距离”.

using System;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        decimal[] array = new decimal[5]{80.23M,80.40M,80.80M,80.00M,20.45M};
        decimal TargetNumber = 70.40M;

        var result = FindClosestIndex(TargetNumber,array,(target,element) => Math.Abs(target - element)); //Optionally add in a "(distance) => distance == 0" at the end to enable early termination.

        Console.WriteLine(result);
    }

    public static int FindClosestIndex<T,U>(T target,IEnumerable<T> elements,Func<T,T,U> distanceCalculator,Func<U,bool> earlyTermination = null) where U : IComparable<U>
    {
        U minDistance = default(U);
        int minIndex = -1;

        using(var enumerator = elements.GetEnumerator())
        for(int i = 0; enumerator.MoveNext(); i++)
        {

            var distance = distanceCalculator(enumerator.Current,target);
            if(minIndex == -1 || minDistance.CompareTo(distance) > 0)
            {
                minDistance = distance;
                minIndex = i;
            }

            if(earlyTermination != null && earlyTermination(minDistance))
                break;
        }

        return minIndex;
    }
}

Runnable example

猜你在找的C#相关文章