web-dev-qa-db-fra.com

Logique de tri personnalisée dans OrderBy à l'aide de LINQ

Quelle serait la bonne façon de trier une liste de chaînes où je veux que les éléments commençant par un trait de soulignement "_" soient au bas de la liste, sinon tout est alphabétique.

En ce moment, je fais quelque chose comme ça,

autoList.OrderBy(a => a.StartsWith("_") ? "ZZZZZZ"+a : a )
49
Bala R

Si vous voulez une commande personnalisée, mais ne voulez pas fournir un comparateur, vous pouvez l'avoir - style sql:

autoList
.OrderBy(a => a.StartsWith("_") ? 2 : 1 )
.ThenBy(a => a);
95
Amy B

Je pense que vous devez utiliser OrderBy(Func<>, IComparer<>) et spécifier votre propre Comparer qui implémentera votre logique personnalisée.

6
abatishchev

Utilisez la surcharge de OrderBy qui prend un IComparer, le premier argument Func alimentera le comparateur, et à partir de là, vous devez comparer les chaînes. Traitez d'abord le cas de l'un ou des deux commence par _, et à partir de là, vous devrez probablement retirer le _ et utilisez simplement la norme string.Compare pour les trier au-delà du premier _

2
Matt Greer