2016-04-07 18 views
0

Ich habe die Auswahl Sortiermethode unten geschrieben. Ich möchte den Code im Allgemeinen behalten, da es eine Schulübung ist, aber ich verstehe, dass es korrektere Wege gibt, wie bei Linq. Es funktioniert gut, abgesehen davon, dass es nur die Eigenschaft PersonalNumber sortiert. Ich kann sehen, wo der Fehler ist die folgende:Methode zum Sortieren einer Liste in C#

temp = list[i].PersonalNumber; 
list[i].PersonalNumber = list[posMin].PersonalNumber; 
list[posMin].PersonalNumber = temp; 

Gibt es eine Möglichkeit alle Eigenschaften für jeden Index in der Liste enthalten sind, zu sortieren? Oder muss ich den obigen Code für jede Eigenschaft schreiben? Es gibt insgesamt drei Eigenschaften.

Voll Methode:

public static void SelectionSort(List<Person> list) { 
    // With this method the Person list is sorted in ascending order. 
    //posMin is short for position of min 
    int posMin, temp; 
    for (int i = 0; i < list.Count - 1; i++) { 
     posMin = i;//Set posMin to the current index of array 
     for (int j = i + 1; j < list.Count; j++) { 
      if (list[j].PersonalNumber < list[posMin].PersonalNumber) { 
       //posMin will keep track of the index that min is in, this is needed when a swap happens 
       posMin = j; 
      } 
     } 

     //if pos_min no longer equals i than a smaller value must have been found, so a swap must occur 
     if (posMin != i) { 
      temp = list[i].PersonalNumber; 
      list[i].PersonalNumber = list[posMin].PersonalNumber; 
      list[posMin].PersonalNumber = temp; 
     } 
    } 
} 
+3

Sie Linq verwenden könnten, wird es sortieren Listen für Sie mit einfachen Kriterien –

+0

Hallo, ich bin noch ein ziemlich Neuling. Ich verlasse Linq für später. Ich lerne immer noch die Grundlagen. – Max

+3

Linq ist dein Freund für diese "Art" der Sache: -p http://stackoverflow.com/questions/722868/sorting-a-list-using-lambda-linq-to-objects – ManoDestra

Antwort

1

Es ist definitiv nicht etwas, das Sie manuell tun sollen (es sei denn, Sie Ihre Algorithmik Fähigkeiten trainieren :)). Dadurch wird Ihr Code komplexer und schwieriger zu verwalten.

einfach gesagt:

using System.Linq; 

und dies tun:

var sorted = list.OrderByDescending(x => x.PersonalNumber).ToList(); 

Sie müssen es nicht sein Linq ninja zu verwenden. Ich empfehle auch dringend, es zu benutzen. Ich denke, Sie können zustimmen, dass es sehr einfach zu lesen ist und ziemlich offensichtlich, was es tut.

Ah, und wenn Sie aufsteigend sortieren möchten, verwenden Sie einfach .OrderBy anstelle von .OrderByDescending.

+0

Hallo und danke für die Antwort. Ich würde gerne die ursprüngliche Programmierung behalten, da es eine Schulübung ist, aber ich werde dann mit Linq gehen. – Max

0

Wenn Sie Liste anstelle sortieren wollen, nur Sort setzen:

list.Sort((x, y) => x.PersonalNumber.CompareTo(y.PersonalNumber)); 

in sortieren absteigender Reihenfolge, hinzufügen -:

list.Sort((x, y) => -x.PersonalNumber.CompareTo(y.PersonalNumber)); 
0

Für die meisten Szenarien, sollten Sie Verwenden Sie eine der integrierten Funktionen zum Sortieren, z. B. List<T>.Sort oder Enumerable.OrderBy. Ich gehe davon aus, dass Sie Ihre eigene Implementierung für den Sortieralgorithmus beibehalten möchten.

Sie können eine Schlüsselauswahlfunktion als zweites Argument an Ihre Methode vorstellen:

public static void SelectionSort<TSource, TKey>(
    List<TSource> list, 
    Func<TSource, TKey> keySelector) 
{ 
    // With this method the list is sorted in ascending order. 
    //posMin is short for position of min 
    int posMin; 
    for (int i = 0; i < list.Count - 1; i++) { 
     posMin = i;//Set posMin to the current index of array 
     for (int j = i + 1; j < list.Count; j++) { 
      if (keySelector(list[j]) < keySelector(list[posMin])) { 
       //posMin will keep track of the index that min is in, this is needed when a swap happens 
       posMin = j; 
      } 
     } 

     //if pos_min no longer equals i than a smaller value must have been found, so a swap must occur 
     TSource temp; 
     if (posMin != i) { 
      temp = list[i]; 
      list[i] = list[posMin]; 
      list[posMin] = temp; 
     } 
    } 
} 

Sie würden dann diesen Ausdruck mit einem Lambda verbrauchen:

SelectionSort(persons, (Person p) => p.PersonalNumber); 
Verwandte Themen