2017-10-22 5 views
0

Ich schreibe eine kleine Klasse, in der ich mich bewegen werde, wenn sie benötigt wird wie eine DLL, und sie wird verschiedene Sortieralgorithmen haben. Ich möchte, dass die Funktionen mit beliebigen Listen beliebiger Typen, einschließlich Objekten, arbeiten. So ist es im Grunde wie folgt:Der beste Weg, um zwei generische Werte zu vergleichen?

class TemplateSortings<T> 
{ 
    List<T> GNRList; 

    static void SortBubble<T>() 
    { 
     //Do stuff with GNRList, which can be a list of any values (nums, strings, objects) 
    } 
} 

Nun ist die Frage, die ich Probleme habe dabei ist - was ist die beste Art und Weise zwei generische Werte zu vergleichen: Überlastung Vergleichsoperatoren oder mit der Klasse IComparable-Schnittstelle erben? Was ist besser und warum?

Antwort

3

Wenn Sie möchten, dass es mit einem beliebigen Typ funktioniert, sollten Sie T wahrscheinlich nicht auf Typen beschränken, die IComparable implementieren, weil nicht alle Typen dies tun.

Eine einfache Möglichkeit, um dies zu umgehen, ist es, den Anrufer entscheiden zu lassen, wie die Objekte zu vergleichen. Sie müssen nur einen zusätzlichen Parameter:

static void SortBubble(Func<T, T, int> comparator) 
{ 
    ... 
} 

Sie comparator mit 2 Argumenten aufrufen kann und es wird Ihnen einen negativen Wert geben, 0 oder einen positiven Wert, der angibt, dass der erste Parameter kleiner als, gleich oder größer als der zweite Parameter.

Als Beispiel können Sie SortBubble mit int s wie folgt aufrufen:

var sorting = new TemplateSortings<int>(); 
// populate the list... 
sorting.SortBubble((x, y) => x.CompareTo(y)) // pass a lambda 

EDIT:

Wenn Sie nicht über einen zusätzlichen Parameter wollen und die Art innerhalb der Methode zu überprüfen, Sie können etwas tun:

if (typeof(IComparable<T>).IsAssignableFrom(typeof(T))) { 
    // do your sorting 
    // you need to cast values of type "T" to "Comparable<T>" like this 
    // var castedValue = (IComparable<T>)tValue; 
} else { 
    throw ... 
} 
+0

Es ist ein wenig unwirksam, meinst du nicht? Ich könnte jetzt wissen, welche Variablen ich verwenden werde, also dachte ich daran, einfach die Liste weiterzugeben, um nach GNRList zu sortieren und sie dann zu sortieren. Ich würde nicht wissen, welcher Typ es sein wird ... – Alucard

+0

Das macht keinen Sinn. Sie müssen ihm sagen, wie Sie die Gegenstände sortieren wollen, oder wie würde der Computer das wissen? @ Alucard – Sweeper

+0

Ich wollte die Funktion selbst den Typ der Liste überprüfen. Was passiert, wenn ich mit Dezimalzahlen oder Strings arbeiten muss? Muss ich eine andere SortBubble-Funktion schreiben, aber diesmal mit ? Oder kann ich einfach den Typ in der Funktion überprüfen? @Sweeper – Alucard

0

Sie Ihren Code verallgemeinern kann, so dass es mit jeder potentiell gültigen Typ arbeiten können T: Jetzt

public static IEnumerable<T> BubbleSort(
    this IEnumerable<T> source, 
    IComparer<T> comparer == null) 
{ 
    var currentComparer = comparer ?? Comparer<T>.Default; 
    //bubble sort with currentComparator 
} 

, können Sie auch immer jede T sortieren, wenn:

  1. T implementiert IComparable<T>
  2. T implementiert Vermächtnis IComparable
  3. Sie eine Comparator vererben, die weiß, wie T vergleichen s

Es wird in keinem anderen Szenario in dem Moment fehlschlagen, in dem Sie versuchen, den ersten Vergleich durchzuführen.

Verwandte Themen