535 Stimmen

Wie kann ich eine .NET-Zeichenkette abschneiden?

Ich möchte eine Zeichenkette so abschneiden, dass sie nicht länger als ein bestimmter Wert ist. Ich schreibe in eine Datenbanktabelle und möchte sicherstellen, dass die Werte, die ich schreibe, die Einschränkung des Datentyps der Spalte erfüllen.

Es wäre zum Beispiel schön, wenn ich Folgendes schreiben könnte:

string NormalizeLength(string value, int maxLength)
{
    return value.Substring(0, maxLength);
}

Leider führt dies zu einer Ausnahme, da maxLength im Allgemeinen die Grenzen der Zeichenfolge überschreitet value . Natürlich könnte ich eine Funktion wie die folgende schreiben, aber ich hatte gehofft, dass so etwas bereits existiert.

string NormalizeLength(string value, int maxLength)
{
    return value.Length <= maxLength ? value : value.Substring(0, maxLength);
} 

Wo ist die schwer fassbare API, die diese Aufgabe erfüllt? Gibt es eine?

31 Stimmen

Für das Protokoll, Strings sind unveränderlich Sie können nicht truncate Sie können nur eine abgeschnittene Kopie von ihnen zurück. Ich weiß, das ist pingelig.

3 Stimmen

@John Weldon: Das ist wahrscheinlich der Grund, warum die Memberfunktion nicht existiert - sie folgt nicht der Semantik des Datentyps. Eine kleine Anmerkung am Rande, StringBuilder können Sie durch Verkürzung der Länge abschneiden, aber Sie müssen immer noch die Längenprüfung durchführen, um eine Verbreiterung der Zeichenkette zu vermeiden.

1 Stimmen

Unabhängig davon, für welche Lösung Sie sich entscheiden, sollten Sie vor dem Aufruf von Substring oder dem Zugriff auf die Length-Eigenschaft eine Prüfung auf eine Null-Zeichenkette hinzufügen.

16voto

Darren Punkte 7954

Anscheinend hat dies noch niemand gepostet:

public static class StringExt
{
    public static string Truncate(this string s, int maxLength)
    {
        return s != null && s.Length > maxLength ? s.Substring(0, maxLength) : s;
    }
}

Durch die Verwendung des &&-Operators wird die Lösung geringfügig besser als die akzeptierte Antwort.

7voto

nologo Punkte 5380

Ich weiß, dass dies eine alte Frage ist, aber hier ist eine gute Lösung:

public static string Truncate(this string text, int maxLength, string suffix = "...")
{
    string str = text;
    if (maxLength > 0)
    {
        int length = maxLength - suffix.Length;
        if (length <= 0)
        {
            return str;
        }
        if ((text != null) && (text.Length > maxLength))
        {
            return (text.Substring(0, length).TrimEnd(new char[0]) + suffix);
        }
    }
    return str;
}

var myString = "hello world"
var myTruncatedString = myString.Truncate(4);

Rückgabe: Hallo...

0 Stimmen

@SarjanWebDev Dieses Sonderzeichen wird in cmd.exe als "." angezeigt.

7voto

chillitom Punkte 23318

Hier ist ein C# 9 Einzeiler:

public static string Truncate(this string value, int maxLength) => value is null or "" || value.Length <= maxLength ? value : value[..maxLength];

0 Stimmen

Das ist eine schöne Sache. Die einzige Beobachtung, die ich habe, ist, dass es besser ist, zu verwenden string.Empty als "" für eine leere Zeichenkette, aus Leistungsgründen...

1 Stimmen

@EdB Dies ist eine Musterübereinstimmung und muss daher ein String-Literal sein. Das heißt, dass in normalen Ausdrücken sowohl string.Empty y "" zur Laufzeit in dieselbe internierte Zeichenkette auflösen.

1 Stimmen

Es stellt sich heraus, dass Sie Recht haben (nach .Net 2.0), ich schätze, man legt sich Gewohnheiten zu, für die es gute Gründe gibt, und diese Gründe verschwinden, aber die Gewohnheiten bleiben!

6voto

Sri Punkte 160

Warum nicht?

string NormalizeLength(string value, int maxLength)
{
    //check String.IsNullOrEmpty(value) and act on it. 
    return value.PadRight(maxLength).Substring(0, maxLength);
}

d.h. für den Fall, dass value.Length < maxLength Leerzeichen an das Ende anfügen oder den Überschuss abschneiden.

0 Stimmen

Sie erzeugen doppelt so viele String-Objekte und es könnte eine NullReferenceException vom PadRight-Aufruf auslösen, wenn der Wert null ist, was unangemessen ist, es sollte eine ArgumentNullException sein.

1 Stimmen

@Jeremy Ich verstehe nicht " es könnte eine NullReferenceException vom PadRight-Aufruf auslösen, wenn value null ist"; habe ich nicht erwähnt "//check string.IsNullOrEmpty(value) and act on it."

6voto

Immer noch keine Truncate-Methode in 2016 für C#-Strings. Aber - C# 6.0 Syntax verwenden:

public static class StringExtension
{
  public static string Truncate(this string s, int max) 
  { 
    return s?.Length > max ? s.Substring(0, max) : s ?? throw new ArgumentNullException(s); 
  }
}

Das klappt hervorragend:

"Truncate me".Truncate(8);
Result: "Truncate"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X