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.

41voto

Marek Malczewski Punkte 556

Eine andere Lösung:

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

2 Stimmen

Sehr elegante Lösung +1

3 Stimmen

Nett, aber das funktioniert nicht bei einer Zeichenkette, die null ist.

32voto

tames Punkte 402

Sie könnten LINQ verwenden... es beseitigt die Notwendigkeit, Zeichenfolgenlänge zu überprüfen. Zugegebenermaßen vielleicht nicht die effizienteste, aber es macht Spaß.

string result = string.Join("", value.Take(maxLength)); // .NET 4 Join

o

string result = new string(value.Take(maxLength).ToArray());

4 Stimmen

Warum ist dies nicht die akzeptierte Antwort? Was ist am einfachsten: eine eigene Erweiterungsmethode zu schreiben, die Sie pflegen/dokumentieren müssen, oder etwas EINGESCHALTETES wie .Take zu verwenden?

11 Stimmen

@mmcrae Linq mag einfacher sein, ist aber auch viel langsamer. Mein Benchmark sagt ~400ms für Linq und nur ~24ms für Substring für 1 Million Iterationen.

2 Stimmen

Diese Lösung sollte niemals verwendet werden. Wie in den beiden obigen Kommentaren erwähnt, wird immer Speicher zugewiesen, auch wenn die vorhandene Zeichenfolge nicht größer als die maximale Länge ist. Außerdem ist sie sehr langsam.

23voto

SeanMC Punkte 1365

Ich habe meine in einer Zeile etwa so gemacht

value = value.Length > 1000 ? value.Substring(0, 1000) : value;

2 Stimmen

Schnell, einfach und schnell. Das ist genau das, was ich brauchte. Danke!

20voto

SunsetQuest Punkte 6552

In C# 8 kann die neue Funktion Ranges verwendet werden...

value = value[..Math.Min(30, value.Length)];

17voto

Joe Punkte 117971

Das .NET Framework verfügt über eine API, um eine solche Zeichenkette abzuschneiden:

Microsoft.VisualBasic.Strings.Left(string, int);

Aber in einer C#-Anwendung werden Sie es wahrscheinlich vorziehen, Ihre eigene Anwendung zu entwickeln, anstatt eine Abhängigkeit von Microsoft.VisualBasic.dll einzugehen, deren Hauptzweck die Abwärtskompatibilität ist.

0 Stimmen

"The .NET Framework has an API" Sie widersprechen sich selbst. Das ist eine VB.NET-API

11 Stimmen

@CamiloTerevinto - es handelt sich um eine API, die mit dem .NET Framework ausgeliefert wird und von jeder verwalteten Sprache aus aufgerufen werden kann.

1 Stimmen

Die VB DLL hat eine Menge guter Sachen in sich. Warum sind so viele c#-Entwickler gegen sie?

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