J'essaie de trier un tableau de nombres qui sont des chaînes et j'aimerais qu'ils trient numériquement.
Le hic, c'est que je ne peux pas convertir les nombres en int .
Voici le code:
string[] things= new string[] { "105", "101", "102", "103", "90" };
foreach (var thing in things.OrderBy(x => x))
{
Console.WriteLine(thing);
}
sortie: 101, 102, 103, 105, 90
Je voudrais: 90, 101, 102, 103, 105
EDIT: La sortie ne peut pas être 090, 101, 102 ...
Mise à jour de l'exemple de code pour dire «choses» au lieu de «tailles». Le tableau peut être quelque chose comme ceci:
string[] things= new string[] { "paul", "bob", "lauren", "007", "90" };
Cela signifie qu'il doit être trié par ordre alphabétique et par numéro:
007, 90, bob, lauren, paul
image10
venir aprèsimage2
? DevraitJanuary
venir avantFebruary
?Réponses:
Passez un comparateur personnalisé dans OrderBy. Enumerable.OrderBy vous permettra de spécifier n'importe quel comparateur de votre choix .
Voici une façon de faire cela:
la source
IsNumeric
méthode est mauvaise, un codage piloté par exception est toujours mauvais. Utilisezint.TryParse
plutôt. Essayez votre code avec une longue liste et cela prendra une éternité.Remplissez simplement avec des zéros de la même longueur:
la source
sizes
ne fonctionnerait pas non plus, car le résultat est d'un type différent. La réponse est en quelque sorte abrégée, en ce que la deuxième ligne montre le résultat sous forme d'expression, mais c'est au lecteur d'en faire quelque chose. J'ai ajouté une autre affectation de variable pour rendre cela plus clair.Et, que diriez-vous de cela ...
la source
"b", "ab", "101", "103", "bob", "abcd"
.La valeur est une chaîne
Travaux
la source
string[] { "Object 1", "Object 9", "Object 14" }
"b", "ab", "101", "103", "bob", "abcd"
.Il existe une fonction native dans Windows
StrCmpLogicalW
qui comparera les nombres en chaînes sous forme de nombres au lieu de lettres. Il est facile de créer un comparateur qui appelle cette fonction et l'utilise pour ses comparaisons.Cela fonctionne même sur des chaînes contenant à la fois du texte et des nombres. Voici un exemple de programme qui montrera la différence entre le tri par défaut et le
StrCmpLogicalW
triquelles sorties
la source
-1 0 10 2
est trié comme0 -1 2 10
essaye ça
Remarque: cela sera utile lorsque tous sont convertibles en chaîne en int .....
la source
ToList()
précédent =>sizes.ToList().OrderBy(x => Convert.ToInt32(x))
Je suppose que ce sera beaucoup plus bon si la chaîne contient des chiffres. J'espère que cela aidera.
PS: Je ne suis pas sûr des performances ou des valeurs de chaîne compliquées, mais cela fonctionnait bien quelque chose comme ceci:
lorem ipsum
lorem ipsum 1
lorem ipsum 2
lorem ipsum 3
...
lorem ipsum 20
lorem ipsum 21
la source
Vous dites que vous ne pouvez pas convertir les nombres en int car le tableau peut contenir des éléments qui ne peuvent pas être convertis en int, mais il n'y a aucun mal à essayer:
Puis comparez comme ceci:
Sortie: 007, 90, 90, 101, 102, 103, 105, bob, lauren, paul
la source
Cela semble une demande étrange et mérite une solution étrange:
la source
Ce site traite du tri alphanumérique et triera les nombres dans un sens logique au lieu d'un sens ASCII. Il prend également en compte les alphas qui l'entourent:
http://www.dotnetperls.com/alphanumeric-sorting
EXEMPLE:
Le code est comme suit:
la source
La réponse donnée par Jeff Paulsen est correcte mais le
Comprarer
peut être beaucoup simplifié à ceci:Cela fonctionne car la seule chose qui est vérifiée pour le résultat de la
Comparer
est si le résultat est plus grand, plus petit ou égal à zéro. On peut simplement soustraire les valeurs d'un autre et n'a pas à gérer les valeurs de retour.De plus, la
IsNumeric
méthode ne devrait pas avoir à utiliser detry
-bloc et peut bénéficier deTryParse
.Et pour ceux qui ne sont pas sûrs: Ce comparateur triera les valeurs de manière à ce que les valeurs non numériques soient toujours ajoutées à la fin de la liste. Si on les veut au début, le deuxième et le troisième
if
bloc doivent être échangés.la source
Essaye ça :
la source
arr = arr.OrderBy (x => x, nouveau NaturalSort ()). ToArray ();
La raison pour laquelle j'en avais besoin était d'être classé dans un répertoire dont les noms de fichiers commençaient par un nombre:
la source
Maintenant, triez les listes et fusionnez-les ...
J'ai jsut essayé d'apporter une contribution à cette question intéressante ...
la source
Ma solution préférée (si toutes les chaînes sont uniquement numériques):
la source
la source
Développant la réponse de Jeff Paulsen. Je voulais m'assurer que peu importe le nombre de groupes de nombres ou de caractères dans les chaînes:
J'ai également pris SplitCharsAndNums à partir d'une page SO après l'avoir modifiée pour traiter les noms de fichiers.
la source
Même si c'est une vieille question, j'aimerais donner une solution:
Woha assez simple non? :RÉ
la source
la source