Comment tronquer un .NET string?
Je tiens à tronquer une chaîne telle que sa longueur n'est pas supérieure à une valeur donnée. Je suis en train d'écrire à une table de base de données et vous voulez vous assurer que les valeurs que j'écris répondre à la contrainte de la colonne du type de données.
Par exemple, ce serait bien si je pouvais écrire ce qui suit:
string NormalizeLength(string value, int maxLength)
{
return value.Substring(0, maxLength);
}
Malheureusement, cela soulève une exception parce que maxLength
dépasse les frontières de la chaîne value
. Bien sûr, je pourrais écrire une fonction comme les suivantes, mais j'espérais que quelque chose comme cela existe déjà.
string NormalizeLength(string value, int maxLength)
{
return value.Length <= maxLength ? value : value.Substring(0, maxLength);
}
Où est l'insaisissable API permettant d'effectuer cette tâche? Est-il un?
- Pour l'enregistrement, les chaînes sont immuables vous ne pouvez pas les tronquer vous ne pouvez retourner une copie tronquée d'entre eux. Pinailleurs, je sais.
- Weldon: C'est probablement la raison pour laquelle la fonction de membre n'existe pas, il ne faut pas suivre la sémantique du type de données. Sur une note de côté,
StringBuilder
vous permet de tronquer par shorterning la longueur, mais vous avez encore besoin pour effectuer le contrôle de la longueur afin d'éviter l'élargissement de la chaîne. - Quelle que soit l'option que vous choisissez, assurez-vous d'ajouter une case pour une chaîne nulle avant l'appel à la sous-Chaîne ou de l'accès à la propriété Length.
- Si c'était le cas, alors il n'y aurait pas des fonctions comme Garniture ou le Remplacer, qui font face à des problèmes sémantiques
- Plus pinailleurs que Microsoft eux-mêmes constamment sont, comme il arrive - qu'ils sont heureux de document, par exemple,
.Trim()
d'une manière qui fait de prêter son de mutation de la chaîne: "Enlève toute attaque et de fuite des blancs de l'espace, les personnages de la la Chaîne actuelle de l'objet."
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas un
Truncate()
méthode sur la chaîne, malheureusement. Vous devez écrire ce genre de logique vous-même. Ce que vous pouvez faire, cependant, est de conclure à une méthode d'extension de sorte que vous n'avez pas à faire de même partout:Maintenant, nous pouvons écrire:
maxLength
est une valeur négative.string ellipsis = ""
, ce qui vous permettrait de l'utiliser comme"myLongUsername".Truncate(9, "...")
qui permettrait le retour"myLong..."
. La longueur de l'ellipse auraient dû être comptabilisées pour le cas où vous tronquez la chaîne, de sorte que le code serait fondamentalement, le changement devalue.Substring(0, maxLength)
àvalue.Substring(0, maxLength - ellipsis.Length) + ellipses
.+ "..."
ailleurs dans le code, jusqu'à ce que j'ai vu ce. Merci!.Take(maxLength
) ?Ou à la place de l'opérateur ternaire, vous pouvez utiliser les Mathématiques.min
value.Substring(0, value.Length)
.maxLength
est une valeur négative.maxLength
à0
ouvalue.Length
; ou j'ai besoin de jeter unArgumentOutOfRangeException
...ce qui fait plus de sens dans ce cas, et est déjà jetés parSubstring
de toute façon.return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
J'ai pensé que je voudrais jeter dans mon application depuis je crois qu'il couvre tous les cas qui ont été abordés par les autres et le fait de manière concise qui est encore lisible.
Cette solution s'appuie surtout sur la Ray solution et ouvre la méthode pour l'utiliser comme une extension de la méthode à l'aide de la ce mot-clé juste comme LBushkin n' dans sa solution.
maxLength
est une valeur négative.Dans .NET 4.0, vous pouvez utiliser le
Take
méthode:Pas testé pour l'efficacité!
Vous pouvez utiliser LINQ... il élimine la nécessité de vérifier la longueur de la chaîne. Certes peut-être pas le plus efficace, mais c'est amusant.
ou
Parce que le test de performance est amusant: (à l'aide de linqpad les méthodes d'extension)
La
truncate
méthode était "sensiblement" plus vite. #microoptimizationDébut
Fin
Trop Longtemps
J'ai fait le mien dans une ligne un peu comme ce
Semble que personne n'a posté ceci encore:
En utilisant le && opérateur fait légèrement mieux que l'on a accepté la réponse.
L' .NET Framework a une API pour tronquer une chaîne de caractères comme ceci:
Mais dans une application en C#, vous aurez probablement mieux rouler que de prendre une dépendance sur Microsoft.VisualBasic.dll, dont la principale raison d'être est d'assurer la compatibilité ascendante.
Microsoft.VisualBasic.Strings
modules .NET de Base est assez vide.Une autre solution:
Je sais que c'est une vieille question, mais voici une belle solution:
Retourne: bonjour...
Une variante similaire avec C# 6 Nuls de propagation de l'opérateur
Veuillez noter que nous nous sommes essentiellement de vérifier si
value
est null deux fois ici.Pas encore de méthode Tronquer en 2016 pour les chaînes de langage C#.
Mais - À L'Aide De C# 6.0 Syntaxe:
Il fonctionne comme un charme:
Prenant @CaffGeek et de simplification:
Kndly noter que tronquer une chaîne pas simplement un moyen justing découpe une chaîne de caractères à une longueur spécifiée seul, mais prendre soin de ne pas diviser le mot.
par exemple de la chaîne : c'est une chaîne de test.
Je veux le couper à 11 . Si nous utilisons tout de la méthode donnée ci-dessus, le résultat sera
c'est de te
Ce n'est pas la chose que nous voulons
La méthode que je suis en utilisant peut pas être parfait, mais il peut gérer la plupart de la situation
Pourquoi pas:
c'est à dire dans le cas
value.Length < maxLength
remplir les espaces à la fin ou tronquer les excès.Juste au cas où il n'y a pas assez de réponses, voici la mienne 🙂
à utiliser:
Pour l'amour de (sur)la complexité, je vais ajouter ma version surchargée qui remplace les 3 derniers caractères avec des points de suspension dans le respect de la maxLength paramètre.
Je préfère jpierson réponse, mais aucun des exemples que je peux voir sont de la manipulation d'un invalide maxLength paramètre, comme lorsque maxLength < 0.
Choix serait de gérer l'erreur dans un try/catch, serrer les maxLength paramètre min à 0, ou si maxLength est inférieure à 0 renvoie une chaîne vide.
Pas de code optimisé:
Ici est un vb.net solution, marque que le si (bien que laid) déclaration améliore les performances car nous n'avons pas besoin de la sous-chaîne d'une déclaration de chaîne est déjà plus petit que maxlength...
En faisant une extension de chaîne, il est facile à utiliser...
Je sais qu'il y a une tonne de réponses déjà, mais mon besoin était de garder le début et la fin de la chaîne intacte, mais la raccourcir en vertu de la longueur max.
C'est pour la création d'Url SharePoint qui ont une longueur maximale de 260 caractères.
Je n'ai pas la longueur d'un paramètre, car c'est une constante 260. Je n'ai pas à faire la première sous-chaîne de longueur d'un paramètre parce que je veux un break à un moment précis. Enfin, la deuxième sous-chaîne est la longueur de la source - 20 car je sais que la structure des dossiers.
Cela pourrait facilement être adaptés à vos besoins spécifiques.
Je sais qu'il y a une tonne de réponses ici déjà, mais c'est celui que j'ai passé avec, qui gère à la fois des chaînes vides et la situation où la durée passée en négatif:
Mes deux cents à l'exemple de la longueur de 30 :
TruncateString
Comme un complément aux possibilités examinées ci-dessus, je voudrais partager ma solution.
C'est une méthode d'extension qui permet null (retourne la chaîne.Vide) il y a aussi un deuxième .Truncate() pour l'utiliser avec des points de suspension. Méfiez-vous, ce n'est pas une performance optimisée.
Il n'y a rien dans .net pour cela que je suis conscient de l' - voici ma version qui ajoute "...":
ToArray()
appel ici est juste inutile au-dessus; par exemple à l'aideString.Concat
vous pouvez construire une chaîne à partir d'une énumération de caractères sans avoir à passer par l'intermédiaire d'un tableau.Je vous Recommande d'utiliser la méthode sous-chaîne de la même fonctionnalité.
Cela a l'avantage de vous laisser épissure de votre chaîne de chaque côté, ou même quelque part dans le milieu sans écrire d'autres méthodes. Espérons que cela aide 🙂
Pour plus d'référence: https://www.dotnetperls.com/substring
Tronquer Chaîne
C'est le code que j'utilise habituellement: