2011-01-12 14 views
17

Wie würde ich in absteigender Reihenfolge sortieren, eine List<Tuple<int, int>> mit dem ersten Element des Tupel als der Wert, der die Reihenfolge bestimmt? Es muss an Ort und Stelle sein und ich weiß nur, wie es mit LINQ funktioniert, das eine neue Liste zurückgibt.Sortierliste <Tupel <int, int>> in-place

Antwort

37

Sie haben soeben einen IComparer<Tuple<int, int>> oder eine Comparison<Tuple<int, int>> zum List<T>.Sort Methode zur Verfügung stellen müssen. Letzteres ist wahrscheinlich einfacher Inline angeben:

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

Wenn Sie durch den ersten Wert bestellen möchten und dann den zweiten Wert, wird es ein bisschen schwieriger, aber immer noch machbar. Zum Beispiel:

list.Sort((x, y) => { 
    int result = y.Item1.CompareTo(x.Item1)); 
    return result == 0 ? y.Item2.CompareTo(x.Item2) : result; 
}); 

EDIT: Ich habe jetzt die oben geändert in absteigender Reihenfolge zu sortieren. Beachten Sie, dass der richtige Weg dazu besteht, die Reihenfolge des Vergleichs umzukehren (y zu x anstelle von x zu y). Sie müssen nicht negieren nur den Rückgabewert von CompareTo - dies wird fehlschlagen, wenn CompareToint.MinValue zurückgibt.

+2

ist das nicht in aufsteigender Reihenfolge sortiert? – BobTurbo

+0

@BobTurbo: Gut entdeckt. Wird reparieren. –

+0

Nach Referenz Quell-Tupel haben Standard-Vergleich, der von Item1 und dann Item2 vergleicht. http://referencesource.microsoft.com/#mscorlib/system/tuple.cs, 189 – ShitalShah

6

Warum nicht das?

List<Tuple<int, int>> list = ... 
list = list.OrderBy(i => i.Item1).ToList(); 

Ja, es erstellt eine neue Liste, aber ich bin nur interessiert - warum magst du das nicht?


List<Tuple<int, int>> list = new List<Tuple<int, int>> 
{ 
    new Tuple<int,int>(1,1), 
    new Tuple<int,int>(0,2), 
    new Tuple<int,int>(3,0) 
}; 

list.Sort(Comparer<Tuple<int, int>>.Default); 

produziert:

0,2 
1,1 
3,0 

Und es ist in-Place, ist es nicht?

+0

Vielleicht, weil es keine In-Place-Sortierung ist? –

+0

@Martinho: Ja, ist es nicht. Ich habe meinen Beitrag bearbeitet, um meine Fragen klarer zu machen. – abatishchev

+0

Ist 'Tuple ' ** dokumentiert ** nach 'Item1' und dann' Item2' zu sortieren? –

3

Haben Sie sich die List<T>.Sort Methode angesehen? Sie können eine Überlastung verwenden, die einen Comparison<T> delegieren oder eine IComparer<T> nimmt:

list.Sort((x,y)=> x.Item1.CompareTo(y.Item1)); 
2
var listSort = from element in list orderby element.Item1 element.Item2 select element; 
Verwandte Themen