2017-01-31 1 views
0

Я реализованных CompareTo() так:Реализовать CompareTo() - сравните различные функции

public override int CompareTo(object obj) 
{ 
    //quick failsafe 
    MyClass other; 
    if (obj is MyClass) 
    { 
    other = obj as MyClass; 
    } 
    else 
    { 
    return 1; 
    } 
    //now we should have another comparable object. 
    /* 
    * 1: this is greater. 
    * 0: equals. 
    * -1: this is less. 
    */ 
    if (other.GetValue() < this.GetValue()) 
    { 
    // this is bigger 
    return 1; 
    } 
    else if (other.GetValue() > this.GetValue()) 
    { 
    //this is smaller 
    return -1; 
    } 
    else 
    { 
    return 0; 
    } 
} 

Однако, самое интересное, когда я хочу, чтобы выбрать функцию GetValue(). У меня есть пара из них: Average(), Best(), CorrectedAverage(), Median(). Я сравниваю по массиву floats. Дело в том, что я не хочу использовать switch-case на enum, который я определил в этом классе, чтобы рассказать, что заказать. Есть ли способ, которым я решаю, какую функцию заказывать красивой и чистой?

ответ

2

Учитывая, что у вашего класса есть целая куча разных способов его сравнения, почти наверняка не должен реализовывать IComparable вообще.

Вместо этого создайте экземпляры IComparer<T> для каждого способа сравнения вашего объекта. Тот, кто хочет сопоставить экземпляры типа, может затем выбрать компаратор, который использует сравнение, наиболее подходящее для их ситуации.

+0

Благодарим за помощь. У меня есть хинч, что вы имеете в виду, но не могли бы вы объяснить немного дальше? Я имею в виду, как это сделать? – hei

+0

@hei Создайте класс, который реализует 'IComparer ' для каждого способа сравнения вашего объекта. Каждый объект сравнивает их по-другому. Кто-то, желающий выполнить операцию, которая требует знания того, как эти объекты сравниваются (например, операция сортировки), может принять сопоставитель, соответствующий ситуации. Если они хотят сравнить с помощью медианного, они используют «MedianComparer», если они хотят сравнить с помощью среднего значения, они используют «MeanComparer» и т. Д. – Servy

+0

Итак, у меня есть 4 функции «CompareTo()»? И я более или менее copy-paste, просто использую разные функции вместо 'GetValue()' – hei

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