我想为String类编写一个扩展方法,以便如果输入字符串比提供的长度N长,则只显示前N个字符。

这是它的样子:

public static string TruncateLongString(this string str, int maxLength)
{
    if (str.Length <= maxLength)
        return str;
    else
        //return the first maxLength characters                
}

什么字符串.*()方法我可以使用只得到str的前N个字符?


当前回答

用c# 8

public static string TruncateLongString(this string str, int maxLength)
{
    if (string.IsNullOrEmpty(str)) return str;

    return str[.. Math.Min(str.Length, maxLength)];
}

其他回答

string.Substring (0, n);// 0 -起始索引,n -字符数

public static string TruncateLongString(this string str, int maxLength)
{
    if (string.IsNullOrEmpty(str)) return str;

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

在c# 8或更高版本中,也可以使用Range使其更简洁:

public static string TruncateLongString(this string str, int maxLength)
{
    return str?[0..Math.Min(str.Length, maxLength)];
}

可以使用表达式体进一步简化:

public static string TruncateLongString(this string str, int maxLength) =>
    str?[0..Math.Min(str.Length, maxLength)];

注意空条件操作符(?)用于处理str为空的情况。这取代了显式空检查的需要。

如果我们还在讨论验证,为什么我们没有检查空字符串条目。有什么具体原因吗?

我认为下面的方式帮助,因为IsNullOrEmpty是一个系统定义的方法,三元操作符的圈复杂度= 1,而if() {} else{}的值为2。

    public static string Truncate(string input, int truncLength)
    {
        return (!String.IsNullOrEmpty(input) && input.Length >= truncLength)
                   ? input.Substring(0, truncLength)
                   : input;
    }

用c# 8

public static string TruncateLongString(this string str, int maxLength)
{
    if (string.IsNullOrEmpty(str)) return str;

    return str[.. Math.Min(str.Length, maxLength)];
}

每当我必须在c#中进行字符串操作时,我就会想念Visual Basic中的Left和Right函数,它们比Substring使用起来简单得多。

所以在我的大多数c#项目中,我为它们创建了扩展方法:

public static class StringExtensions
{
    public static string Left(this string str, int length)
    {
        return str.Substring(0, Math.Min(length, str.Length));
    }

    public static string Right(this string str, int length)
    {
        return str.Substring(str.Length - Math.Min(length, str.Length));
    }
}

注意: 的数学。Min部分的存在是因为当输入字符串的长度小于所请求的长度时,Substring会抛出一个argumentoutofranceexception,正如在前面的回答下的一些评论中已经提到的那样。

用法:

string longString = "Long String";

// returns "Long";
string left1 = longString.Left(4);

// returns "Long String";
string left2 = longString.Left(100);