2014-12-29 5 views
4

Наивный вопрос, который я знаю, и после двухлетнего опыта я застрял, чтобы ответить на него.Общее сравнение двух объектов

Просто мне нужно создать общий метод, и этот метод может принимать INT, двойные, с плавающей точкой и сравнить их и найти большее значение:

object ComapreMethod(object obj1, object obj2) 
{ 
    if(obj1 > obj2) 
    { 
     return obj1; 
    } 

    return obj2; 
} 

Я хочу назвать это для междунар, короткий, UShort , float, double, ... и т. д., что я действительно застрял с тем, как сравнивать между obj1 и obj2. Я не могу написать это, кстати, выше Я знаю, что это наивно, но я не знаю

+4

Лучше пойдите для 'Generics'. –

+0

Я не понимаю, что вы имеете в виду – Miral

+0

Возможный дубликат [C# generics: как сравнить значения родовых типов?] (Http://stackoverflow.com/questions/6480577/c-sharp-generics-how-to-compare -values-of-generic-types) –

ответ

8

Ну, вы можете изменить свою подпись метода с использованием дженериков:

TType ComapreMethod<TType>(TType obj1, TType obj2) where TType : IComparable 

и измените свой код в методе от if(obj1>obj2) до if (obj1.CompareTo(obj2) > 0) (и не забудьте обработать случаи obj1 и obj2, являющиеся нулевыми).

В этом случае вы сможете перейти к своим методам значений некоторого класса, который реализовал интерфейс IComparable, включая ints, doubleles и floats.

+0

Как вы сравните int и decimal с этим методом? – mybirthname

+0

@mybirthname Ну, в вопросе OP явно не указано, что он хочет смешивать разные типы в сравнении. –

+0

Давайте посмотрим, в чем цель, я уверен, что он хочет сравнивать разные типы. – mybirthname

4

Существует встроенное решение, которое будет делать то, что вы хотите, Math.Max (MSDN docs):

var myMax = Math.Max(input1, input2); 

Это будет работать для любых различных типов input1 и input2, которые могут быть неявно преобразованы к одному типу. Таким образом, вы можете взаимозаменяемо использовать int, float и double, и он вернет соответствующее значение в соответствующем типе (например, при передаче int и double он вернет двойной)).

Вы могли бы также, если вы хотите просто изменить свой метод, чтобы принять дубли, если вы хотите:

double CompareMethod(double obj1, double obj2) 
{ 
    if (obj1.CompareTo(obj2) > 0) 
    { 
     return obj1; 
    } 
    return obj2; 
} 

Это снова использует неявное преобразование типа, чтобы сделать Интс Into двойников и т.д. Это будет означать, что ваше возвращение type всегда двойной, но если вы хотите, чтобы ints возвращался, и int вы можете создавать перегрузки, а компилятор должен выбрать лучший.

Лично хотя я советую вам просто использовать встроенный в

+0

Возможно, Math.Max ​​- лучший ответ. Я полностью забываю об этом! – mybirthname

0

вы можете сделать это с помощью отражения. Я получаю тип первого и получить метод CompareTo и запустить его:

void Main() 
{ 
    float a = 2; 
    float b = 1; 
    ComapreMethod(a, b); // A > B 

    short c = 0; 
    short d = 3; 
    ComapreMethod(c, d); // A < B 

    int e = 1; 
    int f = 1; 
    ComapreMethod(e, f); // A == B 
} 

// you can change the return type as you wish 
string ComapreMethod(object a, object b) 
{ 
    var result = Convert.ToInt32(a.GetType().GetMethods().First(o => o.Name == "CompareTo").Invoke(a, new object[] { b })); 

    if (result == 0) 
     return "A == B"; 
    else if (result > 0) 
     return "A > B"; 
    else if (result < 0) 
     return "A < B"; 
    else 
     return "I don't know..."; 
} 
+0

Да, он может. Но использование дженериков не только проще, но и быстрее. – rsenna

+0

@rsenna Я вижу ... Я стараюсь изо всех сил .. –

1

Я полагаю, что вам нужно будет сравнить два различных типа. Пример int и десятичный.

static void Main(string[] args) 
    { 
     decimal p = 15.5m; 
     int q = 5; 

     Console.WriteLine(CompareTo<int, decimal, decimal>(q, p)); 

    } 

    public static T3 CompareTo<T1, T2, T3>(T1 value1, T2 value2) 
     where T3:IComparable 
    { 
     T3 p = ConvertTo<T3>(value1); 
     T3 q = ConvertTo<T3>(value2); 

     if(p.CompareTo(q) >= 0) 
     { 
      return p; 
     } 
     else 
     { 
      return q; 
     } 
    } 

    public static T ConvertTo<T>(object value) 
    { 
     try 
     { 
      return (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture); 
     } 
     catch(Exception ex) 
     { 
      return (T)(typeof(T).IsValueType ? Activator.CreateInstance(typeof(T)) : null); 
     } 

    } 

T1 Ваш первый тип значения, T2 Ваш второй тип значения, которое вы будете сравнивать, T3 будет тип результата, который вы ожидаете (десятичной, двойной и т.д.).

Смежные вопросы