Использование CompareTo () для разных типов .NET (например, int и double) - PullRequest
1 голос
/ 08 марта 2010

У меня есть статический метод, который принимает две переменные типа объекта и запускает метод CompareTo ():

public static int Compare(Object objA, Object objB)
{
   return (((IComparable)objA).CompareTo(objB));
}

Проблема в том, что метод CompareTo () выдает исключение при попытке сравнить разные типы (например, int и double). Кто-нибудь знает лучший способ в C #, чтобы сравнить между двумя различными типами? Или обойти эту проблему?

Спасибо

Ответы [ 5 ]

2 голосов
/ 08 марта 2010

Нет общего способа решения этой проблемы в C #, потому что нет общего решения для нее. Если нет потери информации, компилятор C # неявно преобразует один тип в другой, а затем сравнивает их. В любом другом случае это вызовет исключение.

В этом примере программист, реализовавший интерфейс IComplarable , несет ответственность за принятие решения, если два объекта сравнимы, и вы, как пользователь класса, не имеете на это никакого влияния.

1 голос
/ 08 марта 2010

Если вы работаете только с числовыми значениями, вы можете обойти проблему, описанную Nenad, используя:

public static int Compare(Object objA, Object objB)
{
    object objB_as_AType = System.Convert.ChangeType(objB, objA.GetType());
    return (((IComparable)objA).CompareTo(objB_as_AType));
}

Но будьте очень осторожны, поскольку вы предполагаете, что A является IComparable без какой-либо проверки, и вы должны будете гарантировать, что вовлеченные типы действительно имеют преобразования друг в друга.

1 голос
/ 08 марта 2010

Возможный обходной путь - использовать интерфейс IComparable<T> через отражение:

public static int Compare(Object objA, Object objB)
{
    Type comparableType = typeof(IComparable<>).MakeGenericType(objA.GetType());
    MethodInfo compareMethod = comparableType.GetMethod("CompareTo");
    return (int)compareMethod.Invoke(objA, new[] { objB });
}

Однако, это будет медленнее и будет работать, только если тип objB может быть преобразован в тип objA.

0 голосов
/ 08 марта 2010

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

например, взять ваш пример, сравнить

int i = 10;
double d = 10.2;

они равны? Следует ли повысить целое число до двойного, а затем сравнить? Тогда нет, не равно.
Должно ли двойное число быть усечено до целого числа? Тогда да, они равны.

В вашем статическом методе вам необходимо проверить, одинаковы ли типы A & B, если да, то вы можете вызвать a.compareTo (b).

Если нет, то вам нужно решить, как вы хотите сравнивать различные типы, и реализовать это решение в своем статическом методе.

Надеюсь, это поможет

0 голосов
/ 08 марта 2010

Если вы сравниваете только цифры, это будет работать в большинстве случаев:

public static int Compare(Object objA, Object objB) 
{ 
   return (((IComparable)Convert.ToDouble(objA)).CompareTo(Convert.ToDouble(objB))); 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...