web-dev-qa-db-fra.com

Quelle méthode de la classe String ne renvoie que les N premiers caractères?

J'aimerais écrire une méthode d'extension dans la classe String de sorte que, si la chaîne d'entrée est plus longue que la longueur fournie N, seuls les premiers N caractères soient affichés.

Voici à quoi ça ressemble:

public static string TruncateLongString(this string str, int maxLength)
{
    if (str.Length <= maxLength)
        return str;
    else
        //return the first maxLength characters                
}

Quelle méthode String.*() puis-je utiliser pour obtenir uniquement les premiers N caractères de str?

168
Richard77
public static string TruncateLongString(this string str, int maxLength)
{
    if (string.IsNullOrEmpty(str))
        return str;
    return str.Substring(0, Math.Min(str.Length, maxLength));
}
343
Paul Ruane
string truncatedToNLength = new string(s.Take(n).ToArray());  

Cette solution a un bonus minime en ce que si n est supérieur à la longueur, il fait toujours la bonne chose.

57
Matt Greer

Vous pouvez utiliser LINQ str.Take(n) ou str.SubString(0, n), ce dernier émettant une exception ArgumentOutOfRangeException pour n > str.Length.

Notez que la version de LINQ renvoie un IEnumerable<char>, vous devrez donc convertir le IEnumerable<char> en string: new string(s.Take(n).ToArray()).

30
theburningmonk

Chaque fois que je dois effectuer des manipulations de chaîne en C #, les bonnes vieilles fonctions Left et Right de Visual Basic me manquent, qui sont beaucoup plus simples à utiliser que Substring.

Donc, dans la plupart de mes projets C #, je crée des méthodes d'extension pour eux:

public static class StringExtensions
{
    public static string Left(this string str, int length)
    {
        return str.Substring(0, Math.Min(length, str.Length));
    }

    public static string Right(this string str, int length)
    {
        return str.Substring(str.Length - Math.Min(length, str.Length));
    }
}

Remarque:
La partie Math.Min est présente car Substring lève un ArgumentOutOfRangeException lorsque la longueur de la chaîne d'entrée est inférieure à la longueur demandée, comme déjà mentionné dans certains commentaires des réponses précédentes.

Usage:

string longString = "Long String";

// returns "Long";
string left1 = longString.Left(4);

// returns "Long String";
string left2 = longString.Left(100);
11
Christian Specht

Simplement:

public static String Truncate(String input,int maxLength)
{
   if(input.Length > maxLength)
      return input.Substring(0,maxLength);
   return input;
}
11
Majid
public static string TruncateLongString(this string str, int maxLength)
{
    return str.Length <= maxLength ? str : str.Remove(maxLength);
}
5
kbrimington

si nous parlons de validations, pourquoi n’avons-nous pas vérifié les entrées nuls? Des raisons spécifiques?

Je pense en-dessous de l'aide, car IsNullOrEmpty est une méthode définie par le système et les opérateurs ternaires ont une complexité cyclomatique = 1 alors que si () {} else {} a la valeur 2.

    public static string Truncate(string input, int truncLength)
    {
        return (!String.IsNullOrEmpty(input) && input.Length >= truncLength)
                   ? input.Substring(0, truncLength)
                   : input;
    }
4
sunnytyra

J'ai ajouté cela dans mon projet simplement parce que là où je l'utilise, il y a de grandes chances qu'il soit utilisé dans des boucles, dans un projet hébergé en ligne, je ne voulais donc pas de crash si je pouvais le gérer. La longueur correspond à une colonne que j'ai. C'est C # 7

Juste une ligne:

 public static string SubStringN(this string Message, int Len = 499) => !String.IsNullOrEmpty(Message) ? (Message.Length >= Len ? Message.Substring(0, Len) : Message) : "";
1
substring(int startpos, int lenght);
0
Tokk