2010-06-09 5 views
44

Quel serait le bon moyen 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.Logique de tri personnalisée dans OrderBy utilisant LINQ

En ce moment je fais quelque chose comme ça,

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

Répondre

89

Si vous voulez commander personnalisé, mais ne « t veulent fournir un comparateur, vous pouvez l'avoir - le style sql:

autoList 
.OrderBy(a => a.StartsWith("_") ? 2 : 1) 
.ThenBy(a => a); 
+4

J'aime mieux cette solution. J'oublie toujours ThenBy. –

+0

Merci. C'est parfait. –

+2

+1 Vraiment comme cette solution. Très agréable. –

2

Utilisez la surcharge de OrderBy qui prend un IComparer, le premier argument Func va alimenter le comparateur, et de là vous devez comparer les chaînes. traiter d'abord le cas d'un ou deux commence par _, puis à partir de là, vous aurez probablement besoin de dépouiller les _ et il suffit d'utiliser la norme string.Compare pour les trier au-delà de la première _

+1

Cependant, en toute honnêteté, bien que techniquement votre approche est un hack et peut échouer, il est beaucoup plus simple et plus facile à comprendre votre intention. –