Как я могу сравнить какой-либо числовой тип для обнуления в C#

Я хотел бы создать функцию, которая проверяет, передало ли числовое значение, поскольку аргумент имеет значение, больше, чем нуль. Что-то вроде этого:

public bool IsGreaterThanZero(object value)
{
    if(value is int)
    {
        return ((int)value > 0);
    }
    else if(value is float)
    {
        // Similar code for float
    }

    return false;
}

Я могу попытаться снять объект, переданный в качестве аргумента функции одному типу числовых данных, таким образом, я могу затем выдержать сравнение, он для обнуления вместо того, чтобы проверить на каждого вводит мой если оператор? Если бы состав исполнителей перестал работать, я возвратил бы false. Существует ли лучшее (чтение короче, более читаемо) способ сделать это?

Править: Некоторые спросили о том, если я знаю, что тип будет числовым, почему объект и т.д. Я надеюсь, что это делает вещи более ясными.

Эта функция была бы частью преобразователя Silverlight, который реализует IValueConverter интерфейс, который имеет подпись преобразования

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)

Первое, я только хотел, чтобы преобразователь работал с ints, но мое воображение начало разрастаться и думать что, если у меня есть числа с плавающей точкой и другие числовые типы. Я хотел сделать преобразователь максимально гибким. Первоначально я думал, что вся эта дополнительная информация помешает тому, что я хотел сделать так, я не включал ее в свой вопрос.

14
задан DaveB 10 March 2010 в 23:04
поделиться

7 ответов

Я бы предпочел следующее:

public bool IsGreaterThanZero(object value)
{
    if(value is IConvertible)
    {
        return Convert.ToDouble(value) > 0.0;
    }

    return false;
}

Это позволит безопасно обрабатывать все типы IConvertible (которые включают все типы с плавающей точкой и целые типы в фреймворке, а также любые пользовательские типы).

16
ответ дан 1 December 2019 в 06:47
поделиться

Знает ли caller тип? Если да, то как насчёт:

public static bool GreaterThanZero<T>(T value) where T : struct, IComparable<T>
{
    return value.CompareTo(default(T)) > 0;
}

Преобразования не требуются, и должны работать для любого из встроенных числовых типов - и любых разумных типов значений, которые вы придумаете сами. (Например, это было бы хорошо со структурой Noda Time Duration.)

Обратите внимание, что вызывающему абоненту не обязательно знать тип напрямую - он может знать его только как другой параметр типа с теми же ограничениями. По общему признанию, это может не подходить для вашей ситуации, но я подумал, что все равно упомяну об этом. Если никто не знает тип во время компиляции (и вы не хотите получать динамическую типизацию, чтобы сделать работу за вас в C# 4!), то вызов Convert.ToDouble, вероятно, ваш лучший выбор - просто имейте в виду, что у него могут быть проблемы для System.Numerics.BigInteger из .NET 4.0.

15
ответ дан 1 December 2019 в 06:47
поделиться

Вы можете избежать бокса и распаковки с помощью универсальных шаблонов:

Вот определение функции

class GenericComparation {
    public static bool IsGreaterThanZero<T>(T value) where T : IComparable<T> {
        // Console.WriteLine(value.GetType().Name)
        return value.CompareTo(default(T)) > 0;
    }
}

Использование:

Console.WriteLine(GenericComparation.IsGreaterThanZero(1));
Console.WriteLine(GenericComparation.IsGreaterThanZero(-1.1));
Console.WriteLine(GenericComparation.IsGreaterThanZero(Decimal.Zero));
3
ответ дан 1 December 2019 в 06:47
поделиться

А? Какие числовые типы вас интересуют?

public bool IsGreaterThanZero(double value)
{
    return value > 0;
}

Все они работают ...

    IsGreaterThanZero((int)2);
    IsGreaterThanZero((long)2);
    IsGreaterThanZero((double)2);
    IsGreaterThanZero((float)2);
    IsGreaterThanZero((byte)2);
    IsGreaterThanZero((ulong)2);
4
ответ дан 1 December 2019 в 06:47
поделиться

Почему бы просто не преобразовать Convert.ToDouble или Convert.ToDecimal, а затем выполнить сравнение? Кажется, что так можно обработать большинство типов, которые кто-то может передать.

1
ответ дан 1 December 2019 в 06:47
поделиться

Этот самый простой и быстрый способ сравнить любой числовой тип с нулем выглядит следующим образом:

public bool IsGreaterThanZero(object value) 
{ 
    if (value != null && value.GetType().IsValueType)
        return System.Convert.ToDouble(value) > 0;
    return false; 
}
1
ответ дан 1 December 2019 в 06:47
поделиться

Попробуйте:

double tempValue;
if(double.TryParse(value.ToString(), out tempValue)
{
  return (tempValue > 0)
}
else 
{
  return false;
}
2
ответ дан 1 December 2019 в 06:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: