Ich möchte eine Zeichenfolge so abschneiden, dass ihre Länge nicht länger als ein bestimmter Wert ist. Ich schreibe in eine Datenbanktabelle und möchte sicherstellen, dass die von mir geschriebenen Werte den Einschränkungen des Datentyps der Spalte entsprechen.
Zum Beispiel wäre es schön, wenn ich folgendes schreiben könnte:
string NormalizeLength(string value, int maxLength)
{
return value.Substring(0, maxLength);
}
Leider löst dies eine Ausnahme aus, da im maxLength
Allgemeinen die Grenzen der Zeichenfolge überschritten werden 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 ausführt? Ist dort eines?
StringBuilder
Nebenbei bemerkt, können Sie durch Verkürzen der Länge abschneiden, müssen jedoch die Längenprüfung durchführen, um eine Verbreiterung der Zeichenfolge zu vermeiden..Trim()
dass es irreführend klingt, als würde es die Zeichenfolge mutierenAntworten:
Truncate()
Leider gibt es keine Methode für Zeichenfolgen. Sie müssen diese Art von Logik selbst schreiben. Sie können dies jedoch in eine Erweiterungsmethode einbinden, damit Sie sie nicht überall duplizieren müssen:Jetzt können wir schreiben:
quelle
maxLength
ein negativer Wert vorliegt.Anstelle des ternären Operators können Sie auch Math.min verwenden
quelle
value.Substring(0, value.Length)
.maxLength
ein negativer Wert vorliegt.maxLength
zu0
odervalue.Length
; oder ich muss einArgumentOutOfRangeException
... werfen , was in diesem Fall sinnvoller ist undSubstring
sowieso schon geworfen wird .return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
Ich dachte, ich würde meine Implementierung einwerfen, da ich glaube, dass sie alle Fälle abdeckt, die von den anderen angesprochen wurden, und dies auf eine prägnante Art und Weise, die immer noch lesbar ist.
Diese Lösung baut hauptsächlich auf der Ray-Lösung auf und eröffnet die Methode zur Verwendung als Erweiterungsmethode, indem das Schlüsselwort this verwendet wird, genau wie es LBushkin in seiner Lösung tut .
quelle
maxLength
ein negativer Wert vorliegt.Weil Leistungstests Spaß machen: (mit Linqpad-Erweiterungsmethoden )
Die
truncate
Methode war "deutlich" schneller. # MikrooptimierungFrüh
Spät
Zu lang
quelle
In .NET 4.0 können Sie folgende
Take
Methode verwenden:Nicht auf Effizienz getestet!
quelle
Sie können LINQ verwenden ... Sie müssen die Zeichenfolgenlänge nicht mehr überprüfen. Zugegeben, vielleicht nicht die effizienteste, aber es macht Spaß.
oder
quelle
Ich habe meine in einer Zeile so gemacht
quelle
Es scheint, dass noch niemand dies gepostet hat:
Die Verwendung des Operators && macht es geringfügig besser als die akzeptierte Antwort.
quelle
Das .NET Framework verfügt über eine API zum Abschneiden einer Zeichenfolge wie folgt:
Aber in einer C # -App werden Sie wahrscheinlich lieber Ihre eigene rollen als eine Abhängigkeit von Microsoft.VisualBasic.dll, dessen Hauptziel die Abwärtskompatibilität ist.
quelle
Microsoft.VisualBasic.Strings
Module in .NET Core ziemlich leer .Eine andere Lösung:
quelle
Ich weiß, dass dies eine alte Frage ist, aber hier ist eine schöne Lösung:
Rückgabe: Hallo ...
quelle
Eine ähnliche Variante mit dem Null-Propagationsoperator von C # 6
Bitte beachten Sie, dass wir hier im Wesentlichen
value
zweimal prüfen, ob null ist.quelle
Noch keine Methode zum Abschneiden im Jahr 2016 für C # -Strings. Aber - Verwenden der C # 6.0-Syntax:
Es wirkt wie ein Zauber:
quelle
Nehmen Sie @CaffGeek und vereinfachen Sie es:
quelle
Beachten Sie, dass das Abschneiden einer Zeichenfolge nicht nur das Schneiden einer Zeichenfolge in einer bestimmten Länge bedeutet, sondern auch darauf achten muss, das Wort nicht zu teilen.
zB Zeichenfolge: Dies ist eine Testzeichenfolge.
Ich möchte es um 11 schneiden. Wenn wir eine der oben angegebenen Methoden verwenden, ist das Ergebnis
das ist ein te
Das ist nicht das, was wir wollen
Die Methode, die ich benutze, ist vielleicht auch nicht so perfekt, aber sie kann den größten Teil der Situation bewältigen
quelle
Warum nicht:
dh im Ereignisfeld
value.Length < maxLength
Leerzeichen bis zum Ende oder den Überschuss abschneiden.quelle
Nur für den Fall, dass es hier nicht genug Antworten gibt, hier ist meine :)
benutzen:
quelle
Aus Gründen der (Über-) Komplexität werde ich meine überladene Version hinzufügen, die die letzten 3 Zeichen durch ein Auslassungszeichen in Bezug auf den Parameter maxLength ersetzt.
quelle
Meine zwei Cent mit Beispiellänge von 30:
quelle
Ich bevorzuge die Antwort von jpierson, aber keines der hier gezeigten Beispiele behandelt einen ungültigen maxLength-Parameter, z. B. wenn maxLength <0 ist.
Sie können entweder den Fehler in einem Versuch / Fang behandeln, den Parameter maxLength min auf 0 klemmen oder, wenn maxLength kleiner als 0 ist, eine leere Zeichenfolge zurückgeben.
Nicht optimierter Code:
quelle
Hier ist eine vb.net-Lösung. Markieren Sie, dass die if-Anweisung (obwohl hässlich) die Leistung verbessert, da wir die Teilzeichenfolgenanweisung nicht benötigen, wenn der String bereits kleiner als die maximale Länge ist. Indem Sie ihn zu einer Erweiterung des Strings machen, ist er einfach zu verwenden. ..
quelle
Ich weiß, dass es bereits eine Menge Antworten gibt, aber ich musste den Anfang und das Ende der Zeichenfolge intakt halten, sie aber auf unter die maximale Länge kürzen.
Dies dient zum Erstellen von SharePoint-URLs mit einer maximalen Länge von 260 Zeichen.
Ich habe die Länge nicht zu einem Parameter gemacht, da es sich um eine Konstante 260 handelt. Ich habe auch die erste Teilzeichenfolgenlänge nicht zu einem Parameter gemacht, weil ich möchte, dass sie an einem bestimmten Punkt unterbrochen wird. Schließlich ist der zweite Teilstring die Länge der Quelle - 20, da ich die Ordnerstruktur kenne.
Dies könnte leicht an Ihre spezifischen Bedürfnisse angepasst werden.
quelle
Ich weiß, dass es hier bereits eine Menge Antworten gibt, aber dies ist die, mit der ich gegangen bin, die sowohl Nullzeichenfolgen als auch die Situation behandelt, in der die übergebene Länge negativ ist:
quelle
In C # 8 kann die neue Funktion "Bereiche" verwendet werden ...
quelle
Es gibt nichts in .net dafür, was mir bekannt ist - hier ist meine Version, die "..." hinzufügt:
quelle
TruncateString
quelle
Als Ergänzung zu den oben diskutierten Möglichkeiten möchte ich meine Lösung teilen. Es ist eine Erweiterungsmethode, die null zulässt (gibt string.Empty zurück), außerdem gibt es eine zweite .Truncate () für die Verwendung mit Auslassungspunkten. Achtung, es ist nicht leistungsoptimiert.
quelle
quelle
ToArray()
Anruf hier ist nur unnötiger Aufwand; Mit zB könnenString.Concat
Sie eine Zeichenfolge aus einer Aufzählung von Zeichen erstellen, ohne über ein Array gehen zu müssen.Zeichenfolge abschneiden
quelle
Dies ist der Code, den ich normalerweise verwende:
quelle