web-dev-qa-db-fra.com

Linq Ordonner par un numéro spécifique d'abord, puis montrer tout le reste dans l'ordre

Si j'ai une liste de numéros:

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

et je veux commander par un numéro spécifique, puis montrer le reste. Par exemple, si je choisis "3", la liste devrait être:

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

Vous recherchez linq et c #. Merci

67
vts

Vous pouvez utiliser une comparaison dans OrderBy ou 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 "supérieur" à false).

145
Tim Schmelter

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

Quelques réponses trient déjà les derniers chiffres (ce qui peut être correct car 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 original, pas nécessairement triés au lieu d'être triés, vous pouvez le faire à la place;

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

Comme le souligne @DuaneTheriot, la méthode d'extension IEnumerable OrderBy 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 aussi bien pour trier 3 en premier et garder l'ordre de tous les autres éléments.

3
Joachim Isaksson
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);
2
Adrian Iftode