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.

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"

5voto

Jamie Rees Punkte 7653

Eine ähnliche Variante mit dem Nullpropagationsoperator von C# 6

public static string Truncate(this string value, int maxLength)
{
    return value?.Length <= maxLength ? value : value?.Substring(0, maxLength);
}

Bitte beachten Sie, dass wir im Wesentlichen prüfen, ob value ist hier zweimal Null.

5voto

Ognyan Dimitrov Punkte 5648

Meine zwei Cents mit einer Beispiellänge von 30 :

  var truncatedInput = string.IsNullOrEmpty(input) ? 
      string.Empty : 
      input.Substring(0, Math.Min(input.Length, 30));

5voto

Edwin Beltran Punkte 4139

Wir nehmen @CaffGeek und vereinfachen es:

public static string Truncate(this string value, int maxLength)
    {
        return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
    }

4voto

Sen K. Mathew Punkte 69

Bitte beachten Sie, dass das Kürzen einer Zeichenkette nicht nur bedeutet, dass eine Zeichenkette bei einer bestimmten Länge abgeschnitten wird, sondern dass auch darauf geachtet werden muss, dass das Wort nicht geteilt wird.

z.B. String: Dies ist ein Teststring.

Ich möchte es um 11 Uhr schneiden. Wenn wir eine der oben genannten Methoden anwenden, wird das Ergebnis sein

Dies ist ein Te

Das ist nicht die Sache, die wir wollen

Die Methode, die ich verwende, ist vielleicht auch nicht perfekt, aber sie kann die meisten Situationen bewältigen.

public string CutString(string source, int length)
{
        if (source== null || source.Length < length)
        {
            return source;
        }
        int nextSpace = source.LastIndexOf(" ", length);
        return string.Format("{0}...", input.Substring(0, (nextSpace > 0) ? nextSpace : length).Trim());
}

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