2016-05-08 25 views
2

I Zwei Arrays namens Gewichtungen und Werte. Ich wollte Werte basierend auf der Sortierung von Gewichten sortieren. Das funktioniert einwandfrei.C# array.sort() für mehrere Arrays in absteigender Reihenfolge

Array.Sort(Weights,Values); 

Dies gibt mir Arrays in aufsteigender Reihenfolge sortiert. Ich wollte die gleiche Sortierung in absteigender Reihenfolge vornehmen. Gibt es einen besseren Weg ohne zu verwenden Array.Reverse(Weights) and Array.Reverse(Values)

+0

Wie lange sind "Gewichte" und "Werte"? – Enigmativity

+0

Schreiben Sie einen benutzerdefinierten Vergleicher. – Tdorno

Antwort

4

Sie müssen this overload bedienen und bieten ein Brauch IComparer<T>. Die relativ neue Methode Comparer<T>.Create macht dies viel einfacher, weil Sie einfach einen Delegaten- oder Lambda-Ausdruck in eine IComparer<T> umwandeln können, ohne selbst eine vollständige Implementierung codieren zu müssen. Es ist nicht klar von der Frage, was der Datentyp Weights und Values ist, aber hier ist ein Beispiel unter Verwendung von double[] und int[] jeweils:

var Weights = new [] { 1.7, 2.4, 9.1, 2.1, }; 
var Values = new [] { 7, 9, 5, 3, }; 

Array.Sort(Weights, Values, Comparer<double>.Create((x, y) => y.CompareTo(x))); 

Und nur so zum Spaß, hier ist eine Lösung mit LINQ:

var pairs = Weights.Zip(Values, Tuple.Create); 
var orderedPairs = pairs.OrderByDescending(x => x.Item1); 

Ich würde auch empfehlen, dass Sie eine Klasse zum gemeinsamen Speichern von Gewichten und Werten verwenden und nicht als zwei separate Arrays.

+0

Als Sie für die Antwort. Gewichte ist ein int-Array und Werte sind double-Array. Wie kann ich dieses Szenario mit dem obigen Code behandeln? Können Sie ein Beispiel geben? – Srini

+1

@Srini Sie müssen nur 'Comparer ' zu 'Comparer ' ändern. –

1

Zuerst erstellen Sie eine Struktur, die die entsprechenden Elemente enthält.

var items = 
    Weights 
     .Select((weight, index) => 
      new 
      { 
       Weight = weight, 
       Value = Values[index] 
      } 
     ) 
     .OrderByDescending(item => item.Weight) 
     .ToArray(); 

Dann können Sie das sortierte Array zurück:

Weights = items.Select(item => item.Weight).ToArray(); 
Values = items.Select(item => item.Value).ToArray(); 

Aber Sie auch eine der Antworten hier versuchen können:
Better way to sort array in descending order

Verwandte Themen