232 votes

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

J'aimerais écrire une méthode d'extension de la fonction String de sorte que si la chaîne de caractères en entrée est plus longue que la longueur fournie N seulement le premier N Les caractères doivent être 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                
}

Quoi String.*() Je peux utiliser une méthode pour obtenir seulement le premier N caractères de str ?

464voto

Paul Ruane Points 12840
public static string TruncateLongString(this string str, int maxLength)
{
    if (string.IsNullOrEmpty(str)) return str;

    return str.Substring(0, Math.Min(str.Length, maxLength));
}

En C# 8 ou ultérieur, il est également possible d'utiliser une balise Gamme pour rendre cela un peu plus rapide :

public static string TruncateLongString(this string str, int maxLength)
{
    return str?[0..Math.Min(str.Length, maxLength)];
}

Ce qui peut être encore réduit en utilisant un corps d'expression :

public static string TruncateLongString(this string str, int maxLength) =>
    str?[0..Math.Min(str.Length, maxLength)];

Notez l'opérateur conditionnel nul ( ? ) est là pour gérer le cas où str est nulle. Cela remplace la nécessité d'une vérification explicite de la nullité.

6 votes

Est-ce que Math.Min est nécessaire ? Je pensais que Substring savait que si le second paramètre était supérieur à la longueur, il se contentait d'introduire la longueur ?

16 votes

Je crois que c'est ça : System.String.InternalSubStringWithChecks lancerait ArgumentOutOfRange.

4 votes

Martin : pas que je sache, startIndex > (this.Length - length) lance un ArgumentOutOfRangeException .

83voto

Matt Greer Points 29401
string truncatedToNLength = new string(s.Take(n).ToArray());  

Cette solution présente un petit avantage : si n est supérieur à s.Length, elle fait quand même ce qu'il faut.

13 votes

Oui, mais utiliser Linq pour tronquer une chaîne ? Sachez que cette méthode sera très mauvaise si elle est utilisée plusieurs fois, par exemple dans une boucle. Ne le faites pas par habitude.

3 votes

@ErikE il faut noter que c'est une bonne solution pour le traitement ponctuel de chaînes courtes.

3 votes

Je suis d'accord, la lisibilité est généralement plus importante que la micro perforation. Lorsque la performance devient un problème, on peut alors réévaluer. La plupart du temps, cela n'a pas d'importance.

31voto

theburningmonk Points 5590

Vous pouvez utiliser LINQ str.Take(n) o str.SubString(0, n) où ce dernier déclenchera un ArgumentOutOfRangeException exception pour n > str.Length .

Notez que la version LINQ renvoie un IEnumerable<char> Il faudrait donc convertir le IEnumerable<char> a string : new string(s.Take(n).ToArray()) .

17 votes

N'utilisez pas Linq pour tronquer les chaînes de caractères. C'est ridicule.

9voto

kbrimington Points 14081
public static string TruncateLongString(this string str, int maxLength)
{
    return str.Length <= maxLength ? str : str.Remove(maxLength);
}

2 votes

Notez également que vous pouvez aussi rendre la méthode d'extension nulle en changeant la condition en str == null || str.Length <= maxLength

7 votes

Pour tous ceux qui se demandent si Remove o Substring est meilleur, il n'y a pas de différence. Remove(maxLength) juste des appels Substring(0,maxLength) après un peu de vérification des limites. Ce que vous préférez dépend de ce que vous considérez la troncature comme "prendre les premiers caractères de longueur maximale" ou "jeter tout ce qui dépasse les caractères de longueur maximale". Bien sûr, c'est en fait les deux, alors c'est à vous de voir.

-2voto

Tokk Points 2705
substring(int startpos, int lenght);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X