C#: Limiter la longueur d'une chaîne de caractères? [dupliquer]

cette question a déjà une réponse ici:

  • Comment faire pour tronquer une chaîne de caractères .NET? 27 Réponses

je me demandais simplement comment je pouvais limiter la longueur d'une chaîne en C#.

string foo = "1234567890";

disons que nous l'avons. Comment puis-je limiter foo pour dire, 5 personnages?

33
demandé sur Lemmons 2010-09-30 01:24:13

11 réponses

Les chaînes

en C# sont immuables et dans un certain sens cela signifie qu'elles sont de taille fixe.

Cependant, vous ne pouvez pas contraindre une variable chaîne de caractères pour n'accepter que des chaînes de n caractères. Si vous définissez une variable string, elle peut être assignée à n'importe quelle chaîne . Si tronquer les chaînes de caractères (ou lancer des erreurs) est une partie essentielle de votre logique d'entreprise, envisagez de le faire dans les setters de propriétés de votre classe spécifique (c'est ce que Jon a suggéré, et c'est la façon la plus naturelle de créer des contraintes sur les valeurs dans .NET).

si vous voulez simplement vous assurer qu'il n'est pas trop long (par exemple en le passant comme paramètre à un code d'héritage), tronquez-le manuellement:

const int MaxLength = 5;


var name = "Christopher";
if (name.Length > MaxLength)
    name = name.Substring(0, MaxLength); // name = "Chris"
59
répondu Dan Abramov 2013-08-25 12:13:25

vous pouvez étendre la classe" string " pour vous permettre de retourner une chaîne limitée.

using System;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         // since specified strings are treated on the fly as string objects...
         string limit5 = "The quick brown fox jumped over the lazy dog.".LimitLength(5);
         string limit10 = "The quick brown fox jumped over the lazy dog.".LimitLength(10);
         // this line should return us the entire contents of the test string
         string limit100 = "The quick brown fox jumped over the lazy dog.".LimitLength(100);

         Console.WriteLine("limit5   - {0}", limit5);
         Console.WriteLine("limit10  - {0}", limit10);
         Console.WriteLine("limit100 - {0}", limit100);

         Console.ReadLine();
      }
   }

   public static class StringExtensions
   {
      /// <summary>
      /// Method that limits the length of text to a defined length.
      /// </summary>
      /// <param name="source">The source text.</param>
      /// <param name="maxLength">The maximum limit of the string to return.</param>
      public static string LimitLength(this string source, int maxLength)
      {
         if (source.Length <= maxLength)
         {
            return source;
         }

         return source.Substring(0, maxLength);
      }
   }
}

résultat:

limite5-le q

limite10-le rapide

limit100 - Le brun rapide fox a sauté par dessus le chien paresseux.

31
répondu Michael 2010-09-29 21:56:34

vous ne pouvez pas. N'oubliez pas que foo est une variable de type string .

vous pouvez créer votre propre type, dire BoundedString , et avoir:

BoundedString foo = new BoundedString(5);
foo.Text = "hello"; // Fine
foo.Text = "naughty"; // Throw an exception or perhaps truncate the string

... mais vous ne pouvez pas empêcher une variable string d'être définie à n'importe quelle référence string (ou null).

bien sûr, si vous avez une chaîne de caractères propriété , vous pouvez le faire:

private string foo;
public string Foo
{
    get { return foo; }
    set
    {
        if (value.Length > 5)
        {
            throw new ArgumentException("value");
        }
        foo = value;
    }
}

Est-ce que cela vous aide dans quel que soit votre plus grand contexte?

16
répondu Jon Skeet 2010-09-29 21:30:11

S'il s'agit d'une propriété de classe, vous pouvez le faire dans le setter:

public class FooClass
{
   private string foo;
   public string Foo
   {
     get { return foo; }
     set
     {
       if(!string.IsNullOrEmpty(value) && value.Length>5)
       {
            foo=value.Substring(0,5);
       }
       else
            foo=value;
     }
   }
}
6
répondu jmservera 2010-09-29 21:35:30

string shortFoo = foo.Length > 5 ? foo.Substring(0, 5) : foo;

notez que vous ne pouvez pas simplement utiliser foo.Substring (0, 5) par lui-même car il va lancer une erreur lorsque foo est inférieur à 5 caractères.

5
répondu TTT 2013-03-19 04:40:25

Voici une autre réponse alternative à cette question. Cette méthode d'extension fonctionne assez bien. Cela résout les problèmes de la chaîne est plus courte que la longueur maximale et aussi la longueur maximale étant négatif.

public static string Left( this string str, int length ) {
  if (str == null)
    return str;
  return str.Substring(0, Math.Min(Math.Abs(length), str.Length));
}

une autre solution serait de limiter la longueur à des valeurs non négatives, et de simplement éliminer les valeurs négatives.

public static string Left( this string str, int length ) {
  if (str == null)
    return str;
  return str.Substring(0, Math.Min(Math.Max(0,length), str.Length));
}
3
répondu Archangel33 2016-09-16 14:39:13

la seule raison pour laquelle je peux voir le but dans ce est pour le stockage DB. Si c'est le cas, pourquoi ne pas laisser le DB s'en charger et ensuite pousser l'exception en amont pour être traitée à la couche présentation?

2
répondu Aaron McIver 2010-09-29 21:42:22

Vous pouvez éviter les instruction si, si vous vous protégez à la longueur que vous souhaitez limiter.

string name1 = "Christopher";
string name2 = "Jay";
int maxLength = 5;

name1 = name1.PadRight(maxLength).Substring(0, maxLength);
name2 = name2.PadRight(maxLength).Substring(0, maxLength);

nom1 aura Chris

nom2 aura Jay

non si déclaration nécessaire pour vérifier la longueur Avant d'utiliser la chaîne

1
répondu Chris Ward 2014-11-06 19:29:44

vous pouvez essayer comme ceci:

var x= str== null 
        ? string.Empty 
        : str.Substring(0, Math.Min(5, str.Length));
1
répondu Rahul Tripathi 2015-05-27 07:05:54

foo = foo.Substrat (0,5);

-1
répondu Jonathan S. 2010-09-29 21:26:52

Utiliser Supprimer () ...

string foo = "1234567890";
int trimLength = 5;

if (foo.Length > trimLength) foo = foo.Remove(trimLength);

// foo is now "12345"
-1
répondu Sunsetquest 2016-06-21 22:10:44