无需函数即可将字符串直接限制为一定长度

Pro*_*mer 13 c# unity-game-engine

与此不重复.

我想让一个字符串有一个最大长度.它永远不会超过这个长度.让我们说20个字符长度.如果提供的字符串> 20,则取前20个字符串并丢弃其余字符串.

这个问题的答案显示了如何使用函数限制字符串,但我想在没有函数的情况下直接执行.我希望每次写入字符串时都会发生字符串长度检查.

下面是我并不想这样做:

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

string capString(string strToCap, int strLen)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我能用一个属性完成这个:

const int Max_Length = 20;
private string _userName;

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

然后我可以轻松地使用它,而不是调用函数来限制它:

userName = "Programmer";
Run Code Online (Sandbox Code Playgroud)

这个问题是每个string我想要上限必须为它们定义多个变量.在这种情况下,_userName和userName(属性)变量.

任何聪明的方法,不为每个字符串创建多个变量,同时,每次我想修改时都不必调用函数string?

Ser*_*ite 14

有趣的情况 - 我建议创建一个struct然后为它定义一个隐式转换运算符,类似于此Stack Overflow问题中的操作.

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
}
Run Code Online (Sandbox Code Playgroud)

稍后您可以像这样使用它:

// 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);
Run Code Online (Sandbox Code Playgroud)

注意:遗憾的是,这不是完美的解决方案 - 因为隐式转换没有提供将现有值传递给新实例的方法,所以CappedString使用构造函数需要将使用非默认长度值初始化的任何值进行分配,或者其长度限制将恢复为默认值.


isp*_*iro 6

创建一个包含string属性的类,并将所有代码放在那里.然后,您可以s.Value在任何地方使用具有所需特征的字符串.

就像是:

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)); } }
}
Run Code Online (Sandbox Code Playgroud)

并使用:

Superstring s = new Superstring("z");
s.Value = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
string s2 = s.Value;
Run Code Online (Sandbox Code Playgroud)