Je voudrais tronquer une chaîne de telle sorte que sa longueur ne dépasse pas une valeur donnée. J'écris dans une table de base de données et je veux m'assurer que les valeurs que j'écris respectent la contrainte du type de données de la colonne.
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 déclenche une exception car maxLength
dépasse généralement les limites de la chaîne value
. Bien sûr, je pouvais écrire une fonction comme la suivante, mais j'espérais que quelque chose comme ça existe déjà.
string NormalizeLength(string value, int maxLength)
{
return value.Length <= maxLength ? value : value.Substring(0, maxLength);
}
Où est l'API insaisissable qui effectue cette tâche? Est-ce qu'il y a un?
StringBuilder
vous permet de tronquer en raccourcissant la longueur, mais vous devez toujours effectuer la vérification de la longueur pour éviter d'élargir la chaîne..Trim()
d'une manière qui donne un son trompeur comme s'il mute la chaîne: "Supprime tous les caractères d'espaces blancs de début et de fin du objet String actuel. "Réponses:
Il n'y a
Truncate()
malheureusement pas de méthode sur la chaîne. Vous devez écrire ce genre de logique vous-même. Ce que vous pouvez faire, cependant, c'est envelopper cela dans une méthode d'extension afin que vous n'ayez pas à le dupliquer partout:Maintenant, nous pouvons écrire:
la source
maxLength
valeur est négative.Ou au lieu de l'opérateur ternaire, vous pouvez utiliser Math.min
la source
value.Substring(0, value.Length)
.maxLength
valeur est négative.maxLength
à0
ouvalue.Length
; ou j'ai besoin de lancer unArgumentOutOfRangeException
... qui a plus de sens dans ce cas, et qui est déjà lancé deSubstring
toute façon.return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
J'ai pensé que je mettrais ma mise en œuvre car je pense qu'elle couvre tous les cas qui ont été abordés par les autres et le fait d'une manière concise qui est toujours lisible.
Cette solution s'appuie principalement sur la solution de Ray et ouvre la méthode à utiliser comme méthode d'extension en utilisant le mot-clé this, tout comme LBushkin le fait dans sa solution.
la source
maxLength
valeur est négative.Parce que les tests de performances sont amusants: (en utilisant les méthodes d'extension linqpad )
La
truncate
méthode était "significativement" plus rapide. #microoptimisationDe bonne heure
En retard
Trop long
la source
Dans .NET 4.0, vous pouvez utiliser la
Take
méthode:Non testé pour l'efficacité!
la source
Vous pouvez utiliser LINQ ... cela élimine le besoin de vérifier la longueur des chaînes. Certes, ce n'est peut-être pas le plus efficace, mais c'est amusant.
ou
la source
J'ai fait le mien sur une ligne un peu comme ça
la source
Apparemment, personne n'a encore posté ceci:
L'utilisation de l'opérateur && le rend légèrement meilleur que la réponse acceptée.
la source
Le .NET Framework possède une API pour tronquer une chaîne comme celle-ci:
Mais dans une application C #, vous préférerez probablement rouler la vôtre plutôt que de dépendre de Microsoft.VisualBasic.dll, dont la principale raison d'être est la compatibilité descendante.
la source
Microsoft.VisualBasic.Strings
modules de .NET Core est assez vide .Une autre solution:
la source
Je sais que c'est une vieille question, mais voici une bonne solution:
Retours: bonjour ...
la source
Une variante similaire avec l'opérateur de propagation Null de C # 6
Veuillez noter que nous vérifions essentiellement si la valeur
value
est nulle deux fois ici.la source
Toujours pas de méthode Truncate en 2016 pour les chaînes C #. Mais - Utilisation de la syntaxe C # 6.0:
Il fonctionne comme un charme:
la source
Prendre @CaffGeek et le simplifier:
la source
Notez que tronquer une chaîne ne signifie pas simplement couper une chaîne à une longueur spécifiée, mais il faut faire attention de ne pas diviser le mot.
par exemple chaîne: il s'agit d'une chaîne de test.
Je veux le couper à 11 heures. Si nous utilisons l'une des méthodes indiquées ci-dessus, le résultat sera
c'est un te
Ce n'est pas ce que nous voulons
La méthode que j'utilise n'est peut-être pas aussi parfaite, mais elle peut gérer la plupart des situations
la source
Pourquoi pas:
c'est-à-dire dans les
value.Length < maxLength
espaces du pad d' événement jusqu'à la fin ou tronquer l'excédent.la source
Juste au cas où il n'y aurait pas assez de réponses ici, voici la mienne :)
utiliser:
la source
Par souci de (sur) complexité, j'ajouterai ma version surchargée qui remplace les 3 derniers caractères par des points de suspension par rapport au paramètre maxLength.
la source
Mes deux cents avec une longueur d'exemple de 30:
la source
Je préfère la réponse de jpierson, mais aucun des exemples ici que je peux voir ne gère un paramètre maxLength invalide, comme lorsque maxLength <0.
Les choix seraient soit de gérer l'erreur dans un essai / rattraper, de fixer le paramètre maxLength min à 0, ou si maxLength est inférieur à 0, de renvoyer une chaîne vide.
Code non optimisé:
la source
Voici une solution vb.net, notez que l'instruction if (bien que laide) améliore les performances car nous n'avons pas besoin de l'instruction substring lorsque la chaîne est déjà plus petite que maxlength ... En en faisant une extension à string, elle est facile à utiliser. ..
la source
Je sais qu'il y a déjà une tonne de réponses, mais mon besoin était de garder le début et la fin de la chaîne intacts, mais de les raccourcir sous la longueur maximale.
Il s'agit de créer des URL SharePoint d'une longueur maximale de 260 caractères.
Je n'ai pas fait de la longueur un paramètre car c'est une constante 260. Je n'ai pas non plus fait de la première longueur de sous-chaîne un paramètre parce que je veux qu'elle se casse à un point spécifique. Enfin, la deuxième sous-chaîne est la longueur de la source - 20 puisque je connais la structure des dossiers.
Cela pourrait facilement être adapté à vos besoins spécifiques.
la source
Je sais qu'il y a déjà une tonne de réponses ici, mais c'est celle avec laquelle je suis allé, qui gère à la fois les chaînes nulles et la situation où la longueur passée est négative:
la source
En C # 8, la nouvelle fonctionnalité Ranges peut être utilisée ...
la source
Il n'y a rien dans .net pour cela que je sache - voici ma version qui ajoute "...":
la source
TruncateString
la source
En plus des possibilités discutées ci-dessus, je voudrais partager ma solution. C'est une méthode d'extension qui permet null (retourne string.Empty) et il y a un second .Truncate () pour l'utiliser avec des points de suspension. Attention, ce n'est pas des performances optimisées.
la source
la source
ToArray()
appel ici est juste des frais généraux inutiles; en utilisant par exemple,String.Concat
vous pouvez construire une chaîne à partir d'un nombre de caractères sans avoir à passer par un tableau.Tronquer la chaîne
la source
Voici le code que j'utilise habituellement:
la source