4

一般的なGetMinimum方法があります。string[]IComparableタイプの配列を受け入れます(またはである可能性があります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

とは常にfalseNaN < 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、2番目のパラメーターとして(おそらくオプションのパラメーターとして)取ることができます。

または、より短いアプローチでは、次のようにします。

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

このQ&Aによると、複雑です。NaNを含むDoubleの配列を並べ替える

幸いなことに、あなたはそれをハックすることができます:

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