Linq Reihenfolge zuerst nach einer bestimmten Nummer, dann alle Restreihenfolge anzeigen

78

Wenn ich eine Liste von Zahlen habe:

1,2,3,4,5,6,7,8

und ich möchte nach einer bestimmten Nummer bestellen und dann den Rest zeigen. Wenn ich zum Beispiel '3' wähle, sollte die Liste sein:

3,1,2,4,5,6,7,8

Auf der Suche nach linq und c #. Vielen Dank

vts
quelle

Antworten:

181

Sie können einen Vergleich in OrderByoder verwenden ThenBy, um eine bedingte Sortierung durchzuführen.

list.OrderByDescending(i => i == 3).ThenBy(i => i);

Ich benutze, OrderByDescendingweil ich zuerst übereinstimmende Ergebnisse haben möchte ( trueist "höher" als false).

Tim Schmelter
quelle
4
@cracker: ändern Sie OrderByDescendingzu OrderByoder i == 3zui != 3
Tim Schmelter
Wenn Sie die Zeichenfolgenspalte sortieren möchten myDataList.OrderByDescending(i => i.StringColumnValue[0] == filterStringValue[0]).ToList() . Ich habe deine Logik hier verwendet. Basierend auf dem Filterstartbuchstaben werden diese Ergebnisse in der Reihenfolge mit demselben
Startbuchstaben angezeigt
5

Vielleicht so etwas:

List<int> ls=new List<int>{1,2,3,4,5,6,7,8};
int nbr=3;
var result= ls.OrderBy (l =>(l==nbr?int.MinValue:l));
Arion
quelle
Entschuldigung für den Nekro-Kommentar, aber das ist keine gute Idee. Denn wenn die Liste Einträge von int.MinValue enthält, funktioniert dieser Ansatz nicht.
Kevin
5

Einige Antworten sortieren bereits die letzten Zahlen (was möglicherweise richtig ist, da Sie nur eine bereits sortierte Liste anzeigen). Wenn Sie möchten, dass die "nicht ausgewählten" Nummern in ihrer ursprünglichen, nicht unbedingt sortierten Reihenfolge angezeigt werden , können Sie dies stattdessen tun.

int num = 3;
var result = list.Where(x => x == num).Concat(list.Where(x => x != num));

Wie @DuaneTheriot hervorhebt, führt die Erweiterungsmethode OrderBy von IEnumerable eine stabile Sortierung durch und ändert die Reihenfolge der Elemente mit gleichem Schlüssel nicht. Mit anderen Worten;

var result = list.OrderBy(x => x != 3);

funktioniert genauso gut, um zuerst 3 zu sortieren und die Reihenfolge aller anderen Elemente beizubehalten.

Joachim Isaksson
quelle
1
Sie können das gleiche mit erreichen list.OrderBy(i => i != 3).
Duane Theriot
2
public static IEnumerable<T> TakeAndOrder<T>(this IEnumerable<T> items, Func<T, bool> f)
{       
    foreach ( var item in items.Where(f))
        yield return item;
    foreach (var item in items.Where(i=>!f(i)).OrderBy(i=>i))
        yield return item;
}


var items = new [] {1, 4, 2, 5, 3};
items.TakeAndOrder(i=> i == 4);
Adrian Iftode
quelle