82 votes

Linq Classer d'abord par un nombre spécifique puis afficher tous les autres dans l'ordre.

Si j'ai une liste de chiffres :

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

et je veux commander par un nombre spécifique et ensuite montrer le reste. Par exemple, si je choisis '3', la liste devrait être la suivante :

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

Vous cherchez linq et c#. Merci de votre compréhension.

186voto

Tim Schmelter Points 163781

Vous pouvez utiliser une comparaison dans OrderBy o ThenBy pour effectuer un tri conditionnel.

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

J'utilise OrderByDescending parce que je veux d'abord des résultats correspondants( true est "plus élevé" que false ).

5voto

Arion Points 17617

Peut-être quelque chose comme ça :

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));

5voto

Joachim Isaksson Points 85969

Quelques réponses trient déjà les derniers chiffres (ce qui peut être correct puisque vous ne montrez qu'une liste déjà triée). Si vous voulez que les nombres "non sélectionnés" soient affichés dans leur ordre d'apparition dans la liste, vous pouvez utiliser la fonction de tri. original, pas nécessairement trié par ordre au lieu de trier, vous pouvez plutôt faire ;

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

Comme le souligne @DuaneTheriot, Méthode d'extension OrderBy de IEnumerable effectue un tri stable et ne change pas l'ordre des éléments qui ont une clé égale. En d'autres termes ;

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

fonctionne tout aussi bien pour trier 3 en premier et conserver l'ordre de tous les autres éléments.

3voto

Adrian Iftode Points 9408
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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X