4

我有一个通用的GetMinimum方法。它接受 IComparable 类型的数组(所以它可能是string[]or double[])。在double[]我如何实现此方法以忽略double.NaN值的情况下?(我正在寻找好的做法)

当我通过这个数组

double[] inputArray = { double.NaN, double.NegativeInfinity, -2.3, 3 };

它返回 double.NaN!

public T GetMinimum<T>(T[] array) where T : IComparable<T>
{
    T result = array[0];
    foreach (T item in array)
    {
        if (result.CompareTo(item) > 0)
        {
            result = item;
        }
    }
    return result;
}
4

3 回答 3

5

由于两者NaN < x和都将始终为假,因此根本没有定义要求可以包含NaN > x的集合的最小值。这就像除以零:没有有效的答案。NaN

因此,合乎逻辑的方法是预先过滤这些值。这不会是通用的,但应该没问题。

 var results = inputArray.EliminateNaN().GetMinimum();

关注点分离:过滤不应该是GetMinimum().

于 2013-01-21T19:07:44.073 回答
1

你不能从方法内部。原因是您不知道T方法内部可以包含什么。也许你可以通过一些小演员,但理想情况下这应该是你的方法:

public T GetMinimum<T>(T[] array, params T[] ignorables) where T : IComparable<T>
{
    T result = array[0]; //some issue with the logic here.. what if array is empty
    foreach (T item in array)
    {
        if (ignorables.Contains(item)
            continue;

        if (result.CompareTo(item) > 0)
        {
            result = item;
        }
    }
    return result;
}

现在这样称呼:

double[] inputArray = { double.NaN, double.NegativeInfinity, -2.3, 3 };
GetMinimum(inputArray, double.NaN);

如果您确定只有项目被忽略,那么您可以将T其作为第二个参数(也许作为可选参数)。

或者以更短的方式,只是:

inputArray.Where(x => !x.Equals(double.NaN)).Min();
于 2013-01-21T19:04:49.523 回答
-1

根据这个问答,这很复杂:对其中包含 NaN 的 Doubles 数组进行排序

幸运的是,您可以绕过它:

if( item is Single || item is Double ) {
    Double fitem = (Double)item;
    if( fitem == Double.NaN ) continue;
}
于 2013-01-21T19:06:34.413 回答