Как проверить, является ли числовое значение нулевым - PullRequest
0 голосов
/ 09 июня 2018

Здесь у меня есть минимальный пример класса, который должен моделировать вектор (который будет использоваться для вычислений линейной алгебры).Он включает тип T, который будет целочисленным или с плавающей запятой (например, int или double).Теперь я хотел реализовать метод CheckIfZeroAt, который проверяет, содержит ли определенная запись ноль или нет.Проблема в том, что я хочу оставить переменную типа T, но, насколько я знаю, я не могу сказать компилятору, что I T - это числовой тип, для которого доступна тип-трансляция.К сожалению, также не существует интерфейса для числовых типов, которым я мог бы ограничить T.

Есть ли какой-нибудь элегантный способ решить эту проблему?

Я включил несколько наивных способов, которыми можно попытаться реализовать этот метод в качестве комментариев, но ни один из них не работает.

class MyVector<T> // T is an integral or floating point type
{
    T[] vector;

    public MyVector(T[] array)
    {
        vector = array; //just a reference 
    }

    public bool CheckIfZeroAt(int i)
    {
        // return vector[0] == (T)0; //"Cast is redundant"
        // return vector[0] == 0; // Operator "==" cannot be applied to operands of type "T" and "int"
        // return vector[0] == 2 * vector[0]; // Operator "*" cannot be applied to operands of type "T" and "int"
    }

}

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Вы можете использовать IConvertible .Это позволяет использовать все типы числовых значений.Он также допускает DateTime, string и bit, но если кто-то решит использовать MyVector<bool>, кто вы такой, чтобы спорить?Это по-прежнему число, вроде.

Примечание. Так как типы с плавающей запятой могут иметь ошибку, вы, вероятно, хотите разрешить допуск.В моем примере допуск составляет 0,1.(Если вы в порядке с допуском 0,5, вы можете просто преобразовать в int вместо использования Math.Abs).

class MyVector<T> where T : IConvertible
{
    T[] vector;

    public MyVector(T[] array)
    {
        vector = array; //just a reference 
    }

    public bool CheckIfZeroAt(int i, decimal tolerance = 0.1M)
    {
        return Math.Abs(Convert.ToDecimal(vector[i])) < tolerance;
    }

    public bool CheckIfZeroAt(int i)
    {
        return Convert.ToInt32(vector[i])) == 0;
    }

}
0 голосов
/ 09 июня 2018

Числовые типы в .NET имеют по умолчанию 0 , поэтому просто проверьте, равно ли оно default(T)

public bool CheckIfZeroAt(int i)
{
    return vector[i].Equals(default(T));
}

Fiddle здесь

Как указывает Ганс в комментариях, это не самое лучшее решение.Похоже, вам следует просто пропустить универсальные шаблоны, так как в .NET не так много стандартных числовых типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...