2016-12-08 3 views
14

Kein Duplikat von this.Cap-String auf eine bestimmte Länge direkt ohne Funktion

Ich möchte eine Zeichenfolge eine maximale Länge haben. Es sollte niemals diese Länge überschreiten. Sagen wir eine 20 char Länge. Wenn die angegebene Zeichenfolge> 20 ist, nehmen Sie die ersten 20 Zeichen und verwerfen Sie den Rest.

The Antworten auf diese Frage zeigt, wie eine Zeichenfolge mit einer Funktion zu begrenzen, aber ich möchte es direkt ohne eine Funktion tun. Ich möchte die Überprüfung der Zeichenfolge Länge jedes Mal, wenn die Zeichenfolge geschrieben wird.

Unten ist das, was ich tun, um nicht wollen:

string myString = "my long string"; 
myString = capString(myString, 20); //<-- Don't want to call a function each time 

string capString(string strToCap, int strLen) 
{ 
    ... 
} 

Ich konnte dies mit einer Eigenschaft erreichen:

const int Max_Length = 20; 
private string _userName; 

public string userName 
{ 
    get { return _userName; } 
    set 
    { 
     _userName = string.IsNullOrEmpty(value) ? "" : value.Substring(0, Max_Length); 
    } 
} 

Dann kann ich es leicht whout Aufruf ein verwenden Funktion, um es zu verschließen:

userName = "Programmer"; 

Das Problem mit diesem ist, dass jede string ich möchte, haben mehrere Variablen für sie zu begrenzen. In diesem Fall sind die _userName und die userName (Eigenschaft) Variablen.

Jede clevere Möglichkeit, dies zu tun, ohne mehrere Variablen für jede Zeichenfolge und gleichzeitig zu erstellen, muss nicht jedes Mal eine Funktion aufrufen, die ich string ändern möchte?

+0

Neben den Antworten unten können Sie ein AOP-Framework wie PostSharp verwenden, um ein Attribut zu definieren, das Ihre Property Setter abfängt. PostSharp hat eine kostenlose/Express Edition. –

+0

Danke für den Vorschlag. Ich verwende Unity3D und Mono und versuche, die Verwendung von Drittanbieterbibliotheken zu verhindern, die die Binärgröße erhöhen oder Probleme auf mobilen Geräten verursachen. – Programmer

+0

Keine Ahnung, ob es funktioniert oder nicht, aber respektiert Unity das ['StringLengthAttribute'] (https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.stringlengthattrute (v = vs.110).aspx) in .NET integriert? –

Antwort

14

interessante Situation - Ich würde vorschlagen, eine struct erstellen und dann eine implicit conversion operator für sie, ähnlich wie die Definition, was in this Stack Overflow question gemacht wurde.

public struct CappedString 
{ 
    int Max_Length; 
    string val; 

    public CappedString(string str, int maxLength = 20) 
    { 
     Max_Length = maxLength; 
     val = (string.IsNullOrEmpty(str)) ? "" : 
       (str.Length <= Max_Length) ? str : str.Substring(0, Max_Length); 
    } 

    // From string to CappedString 
    public static implicit operator CappedString(string str) 
    { 
     return new CappedString(str); 
    } 

    // From CappedString to string 
    public static implicit operator string(CappedString str) 
    { 
     return str.val; 
    } 

    // To making using Debug.Log() more convenient 
    public override string ToString() 
    { 
     return val; 
    } 

    // Then overload the rest of your operators for other common string operations 
} 

Später können Sie es wie so verwenden:

// Implicitly convert string to CappedString 
CappedString cappedString = "newString"; 

// Implicitly convert CappedString to string 
string normalString = cappedString; 

// Initialize with non-default max length 
CappedString cappedString30 = new CappedString("newString", 30); 

Hinweis: Dies ist nicht perfekte Lösung, leider - da die implizite Konvertierung keine Möglichkeit nicht gibt vorhandene Werte zu der Übertragung Neue Instanz, die mit einem nicht standardmäßigen Längenwert initialisiert wurde, muss mit dem Konstruktor CappedString zugewiesen werden, oder die Längenbeschränkung wird auf den Standardwert zurückgesetzt.

+0

+1. Ich mag das besser als meine Antwort. (Ich suchte nach einem Weg, 's =" String "zu haben, aber ich dachte nicht daran, Operatoren zu definieren.) Gute Arbeit! – ispiro

+0

Super mit dem Operator überladen + Struktur auch. – Programmer

+0

Ich habe es gerade versucht. Ich bekomme 'ArgumentOutOfRangeException: startIndex + length> this.length' Ausnahme. Ich denke, du solltest es ausprobieren und selbst sehen – Programmer

6

Erstellen Sie eine Klasse mit einer string-Eigenschaft und geben Sie den gesamten Code dort ein. Dann können Sie s.Value irgendwo als eine Zeichenfolge mit der erforderlichen Eigenschaft verwenden.

Etwas wie:

class Superstring 
{ 
    int max_Length = 20; 
    string theString; 

    public Superstring() { } 
    public Superstring(int maxLength) { max_Length = maxLength; } 
    public Superstring(string initialValue) { Value = initialValue; } 
    public Superstring(int maxLength, string initialValue) { max_Length = maxLength; Value = initialValue; } 

    public string Value { get { return theString; } set { theString = string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(max_Length, value.Length)); } } 
} 

und Verwendung:

Superstring s = new Superstring("z"); 
s.Value = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"; 
string s2 = s.Value; 
+0

In der Hoffnung, das Erstellen einer anderen Klasseninstanz zu vermeiden, die die Hauptstring enthält. Das sind mehrere Schritte und benötigen mehr Speicher als der Code in meiner Frage. Ich werde abwarten, ob es einen anderen Weg gibt. – Programmer

Verwandte Themen