Si vous avez des chaînes comme: Comment pouvez-vous les trier de sorte que "File_11" ne vient pas après "File_1", mais vient après "File_6", depuis 11> 6 . P> Dois-je analyser la chaîne et le convertir en un numéro pour cela? P> Explorateur Windows dans Win7 True des fichiers de la façon dont je voulais. P> P> P> P> P> P >
6 Réponses :
Dois-je analyser la chaîne et la convertir en un numéro pour cela? p>
essentiellement, oui; Mais Linq peut aider: P>
var sorted = arr.OrderBy(s => int.Parse(s.Substring(5))); foreach (string s in sorted) { Console.WriteLine(s); }
Merci Marc. C'est certainement plus propre.
BTW Marc, y a-t-il une "jusqu'à la fin de la chaîne" pour passer à une sous-chaîne? Sinon, j'ai besoin de faire des calculs qui m'empêcheront d'utiliser la notation de points, non?
La surcharge ci-dessus est i> la "jusqu'à la fin de la chaîne" ... Le 5 est l'index Démarrer i>.
Un moyen simple est de plaire la partie numérique comme suit: etc. p> mais cela résulte de la valeur maximale La partie numérique peut prendre. < / p> p>
Merci. Comment rembourrez-vous les chiffres en C #? Voulez-vous dire analyser et insérer le nombre dans la chaîne?
Je pense que Mitch signifie: essayez de ne pas commencer avec ces données en premier lieu ... Changez votre entrée sur Éviter B> la nécessité de le traiter.
Merci je vois. Malheureusement, je n'aurai pas le contrôle des noms de fichiers (sur les machines utilisateur) :)
Vous pouvez importer le StrcmplogicalW fonction et utiliser cela pour trier la cordes. Ceci est la même fonction que l'explorateur elle-même utilise pour les noms de fichiers. P>
ne vous aidera pas si vous ne voulez pas p / invoquer ou rester compatible sur d'autres systèmes, cependant. P>
J'ai utilisé l'approche suivante dans un projet il y a un moment. Ce n'est pas particulièrement efficace, mais si le nombre d'éléments à trier n'est pas énorme, il est suffisamment performant pour cette utilisation. Ce qu'il fait, c'est que cela divise les chaînes de comparer dans des tableaux sur le caractère Il dispose également d'une sortie précoce si les chaînes d'entrée contiennent un nombre différent d'éléments (donc si vous comparez "File_nbr_1" à " File_23 ", il n'entrera pas la comparaison de chaque partie des chaînes, mais plutôt d'une comparaison régulière des chaînes sur les chaînes complètes): p> '_' code>, puis compare chaque élément des tableaux. Une tentative est faite pour analyser le dernier élément en tant qu'ob et faire une comparaison numérique là-bas.
Pour gérer le tri des chaînes et des chiffres intermérés pour tout type de format, vous pouvez utiliser une classe comme celle-ci pour diviser les chaînes en composants de chaîne et de numéro et de les comparer: Exemple: p> sortie: p>
@nawfal: Si vous appelez trier code> sans le comparateur, il utilisera la comparaison de chaînes par défaut et vous obtenez un résultat différent. En outre, la classe
list
@Guffa Non, je voulais dire que l'on doit implémenter tout ce que vous avez écrit, y compris l'interface comme Classe publique Stringnum: Icomarable
items.sort ((a, b) => nouveau StringNum (A) .compareto (nouveau StringNum (B))); code> ne fonctionnera pas dans .NET 2.0 Je suppose .. Ou serait-ce? Je viens d'utiliser
items.sort () code> au lieu de cela et obtenu le code fonctionner ..!
@nawfal: l'expression de la Lambda ne fonctionnera pas dans C # 2.0, vous suffisez-la simplement à l'aide d'un délégué à la place: items.sort (Délégué (String A, String B) {Retourne Nouveau StringNum (A) .compareto (Nouveau Stringnum (b));}); code>.
@Guffa merci pour cela .. Mais alors comment a utilisé juste .sort () code> travail pour moi? savez-vous pourquoi? Quand j'ai simplement essayé de faire
.sort () code> sans aucun
icomparable
: icomparable
.sort () code> (la première méthode dans ce lien). Donc je suppose que le mien devrait fonctionner
@nawfal: Il devait y avoir une autre raison pour l'exception, la classe stressnum code> n'a aucun lien avec la classe code> de la catégorie code>, donc si vous ne l'utilisez pas dans le < Code> Trier CODE> Appelez cela ne changera pas du tout. Dans l'exemple que vous lisez, ils ont une liste
Trier code> La méthode utilisera cela sans spécifier une comparaison dans l'appel. Cela ne fonctionne pas avec une liste
@Guffa ya vous avez raison. Je vais pour votre code items.sort (délégué (String A, String B) {Retour Nouveau StringNum (A) .compareto (Nouveau StringNum (B));}); Code>. Merci pour ça ! :)
@JOSHG: Oui, c'est vrai. Cependant, il est parfois difficile de déterminer quand un nombre est réellement négatif. Par exemple, dans une chaîne comme "ABC-45-DEF" code>, le premier tiret pourrait être un séparateur ou indiquer un nombre négatif.
@Guffa: beau travail, mais trier ces deux listes (qui ont les mêmes éléments), produisent différents résultats: {"B10", "B", "A", "A10"}, {"A10", "A", "B", "B10"}. Est-ce un bug ou une fonctionnalité ;) ?
@Razvansocol: C'est un bug, bien sûr. :) Merci de l'avoir tapé. J'ai négligé comment différentes chaînes de longueur doivent être triées. J'ai corrigé le code dans la réponse.
Le code suivant basé sur la suggestion de Joey fonctionne pour moi (méthode d'extension à chaîne []):
C'est génial, mais où obtenez-vous le shlwapi.dll? De plus, il semble que cela ne fonctionne pas dans Windows7
+1: couper et coller cela parfaitement pour moi, et sur Windows-7 aussi.
Vérifiez également l'alphanum algorithme: DAVEKOELLE.COM/ALPHANUM.HTML
Merci DFA, intéressant en effet.
Voici un très bon lien .. CODEDIGEST.COM/Articles/CSHARP/84_SORTING_IN_GENERIC_LIST.AS PX
Stackoverflow.com/questions/248603/... < / a>