String类中的哪个方法只返回前N个字符?

Ric*_*d77 177 .net c# string character

我想为类编写一个扩展方法,String这样如果输入字符串的长度超过提供的长度N,则只显示第一个N字符.

这是它的样子:

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

String.*()可以用什么方法来获取第一个N字符str

Pau*_*ane 354

public static string TruncateLongString(this string str, int maxLength)
{
    if (string.IsNullOrEmpty(str))
        return str;
    return str.Substring(0, Math.Min(str.Length, maxLength));
}
Run Code Online (Sandbox Code Playgroud)

  • 我相信它是:System.String.InternalSubStringWithChecks将抛出ArgumentOutOfRange. (12认同)
  • 需要Math.Min吗?我认为Substring知道如果第二个参数大于长度,它只是插入长度? (6认同)
  • @Martin:不是我能看到的,`startIndex>(this.Length - length)`抛出一个'ArgumentOutOfRangeException`. (2认同)
  • 我打算建议检查`Math.Min(str.Length,maxLength)== str.Length`,以防你最终创建一个不必要的字符串以返回"str的第一个str.Length字符",但是Substring这样做检查你,如果你要求整个字符串,只是"返回这个". (2认同)
  • 如果您希望扩展方法处理可能为空的字符串... return str?.Substring(0, Math.Min(str.Length, maxLength)); (2认同)

Mat*_*eer 61

string truncatedToNLength = new string(s.Take(n).ToArray());  
Run Code Online (Sandbox Code Playgroud)

这个解决方案有一个很小的好处,如果n大于s.Length,它仍然是正确的.

  • 这是基准:https://gist.github.com/ultimaweapon/15d52c412612fedd2812068952006122 (11认同)
  • 是的,但是使用Linq截断字符串?请注意,如果多次使用,例如在循环中,这将表现得非常糟糕.不要因为习惯这样做 (5认同)
  • @ErikE可能会注意到,这是一次性短字符串处理的良好解决方案。 (3认同)
  • 我同意,可读性通常比微观性能更重要。当性能成为问题时,可以重新评估。大多数时候这并不重要。 (3认同)

the*_*onk 31

您可以使用LINQ,str.Take(n)或者str.SubString(0, n)后者将抛出ArgumentOutOfRangeException异常n > str.Length.

请注意LINQ版本返回一个IEnumerable<char>,所以你必须转换IEnumerable<char>string:new string(s.Take(n).ToArray()).

  • 不要使用Linq来截断字符串.这是荒谬的. (5认同)

Maj*_*jid 13

只是:

public static String Truncate(String input,int maxLength)
{
   if(input.Length > maxLength)
      return input.Substring(0,maxLength);
   return input;
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*cht 13

每当我必须在C#中进行字符串操作时,我都会错过Visual Basic中的旧函数LeftRight函数,这些函数比使用它更简单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));
    }
}
Run Code Online (Sandbox Code Playgroud)

注:
Math.Min部分是有原因Substring引发ArgumentOutOfRangeException,当输入字符串的长度比要求的长度短,如以前的答案在一些评论已经提到.

用法:

string longString = "Long String";

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

// returns "Long String";
string left2 = longString.Left(100);
Run Code Online (Sandbox Code Playgroud)


kbr*_*ton 6

public static string TruncateLongString(this string str, int maxLength)
{
    return str.Length <= maxLength ? str : str.Remove(maxLength);
}
Run Code Online (Sandbox Code Playgroud)

  • 对于任何想知道"删除"或"子串"是否更好的人来说,没有区别.`删除(maxLength)`在一些边界检查后调用`Substring(0,maxLength)`.您更喜欢哪个取决于您是否将截断视为"取第一个maxLength字符"或"丢弃maxLength字符后的所有内容".当然,它真的都是由你自己决定的. (4认同)
  • 另请注意,您还可以通过将条件更改为“str == null ||”来使扩展方法为空安全。str.Length &lt;= maxLength` (2认同)

小智 5

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

我认为下面的方式有所帮助,因为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;
    }
Run Code Online (Sandbox Code Playgroud)