3 étapes sont nécessaires pour effectuer le travail :
1) divisé par le séparateur
2) convertir en int
car dans une comparaison de chaînes de caractères, un 6 vient après un 1 ou un 10.
3) utiliser OrderBy pour trier votre collection
Voici une solution linq en une seule ligne réalisant les 3 étapes :
list = list.OrderBy(x => Convert.ToInt32(x.Split('|')[0])).ToList();
Explication
x =>
expression lambda, x désigne un élément unique de votre liste
x.Split('|')[0]
divise chaque chaîne et ne prend que la première partie de celle-ci (temps)
Convert.ToInt32(..
convertit l'heure en un nombre afin que la commande soit effectuée comme vous le souhaitez.
list.OrderBy(
trie votre collection
EDITAR:
Pour comprendre pourquoi vous avez obtenu le résultat en premier lieu, voici un exemple de comparaison de nombres dans une représentation de chaîne de caractères à l'aide de la fonction CompareTo méthode :
int res = "6".CompareTo("10");
res aura la valeur de 1
(ce qui signifie que 6 est plus grand que 10 ou que 6 suit 10)
Selon la documentation->remarques :
La méthode CompareTo a été conçue principalement pour être utilisée dans des opérations de tri ou d'alphabétisation.