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

时间:2016-12-08 20:51:12

标签: c# unity3d

this不重复。

我想让字符串具有最大长度。它永远不会超过这个长度。让我们说20个字符长度。如果提供的字符串是> 20,取第20个字符串并丢弃其余部分。

关于该问题的

The答案显示了如何使用函数限制字符串,但我想在没有函数的情况下直接执行此操作。我希望每次写入字符串时都会进行字符串长度检查。

以下是想要做的事情:

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

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

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

const int Max_Length = 20;
private string _userName;

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

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

userName = "Programmer";

这个问题是我想要限制的每个string都必须为它们定义多个变量。在这种情况下,_userNameuserName(属性)变量。

任何聪明的方法都可以在不为每个字符串创建多个变量的情况下同时执行此操作,而不必在每次要修改string时调用函数?

2 个答案:

答案 0 :(得分:14)

有趣的情况 - 我建议创建struct,然后为其定义implicit conversion operator,类似于this Stack Overflow question中的内容。

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
}

稍后您可以这样使用它:

// 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);

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

答案 1 :(得分: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)); } }
}

并使用:

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