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

时间:2010-08-25 14:22:30

标签: c# .net 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                
}

我可以使用哪种String.*()方法仅获取N的第一个str字符?

13 个答案:

答案 0 :(得分:338)

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

答案 1 :(得分:55)

string truncatedToNLength = new string(s.Take(n).ToArray());  

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

答案 2 :(得分:30)

您可以使用LINQ str.Take(n)str.SubString(0, n),后者会为ArgumentOutOfRangeException引发n > str.Length例外。

请注意,LINQ版本会返回IEnumerable<char>,因此您必须将IEnumerable<char>转换为stringnew string(s.Take(n).ToArray())

答案 3 :(得分:11)

简单地:

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

答案 4 :(得分:10)

每当我必须在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));
    }
}

注意:
Math.Min部分存在,因为Substring在输入字符串的长度小于请求的长度时抛出ArgumentOutOfRangeException,如前面答案中的一些评论中已经提到的那样。

用法:

string longString = "Long String";

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

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

答案 5 :(得分:5)

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

答案 6 :(得分:4)

如果我们讨论验证也是为什么我们没有检查空字符串条目。任何具体原因?

我认为以下方式有帮助,因为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;
    }

答案 7 :(得分:1)

我在我的项目中添加了这个,因为在我使用它的地方很有可能在循环中使用它,在一个在线托管的项目中因此我不希望任何崩溃,如果我可以管理它。长度适合我的专栏。这是C#7

只需一行:

 public static string SubStringN(this string Message, int Len = 499) => !String.IsNullOrEmpty(Message) ? (Message.Length >= Len ? Message.Substring(0, Len) : Message) : "";

答案 8 :(得分:0)

substring(int startpos, int lenght);

答案 9 :(得分:0)

.NET Substring方法充满了危险。我开发了可以处理各种情况的扩展方法。妙处是它保留了原始行为,但是当您添加一个附加的“ true”参数时,它随后将使用扩展方法来处理异常,并根据索引和长度返回最符合逻辑的值。例如,如果长度为负数,则向后计数。您可以在https://dotnetfiddle.net/m1mSH9的小提琴中查看具有各种值的测试结果。这将为您提供有关如何解析子字符串的清晰思路。

我总是将这些方法添加到我的所有项目中,而不必担心代码中断,因为某些更改和索引无效。下面是代码。

    public static String Substring(this String val, int startIndex, bool handleIndexException)
    {
        if (!handleIndexException)
        { //handleIndexException is false so call the base method
            return val.Substring(startIndex);
        }
        if (string.IsNullOrEmpty(val))
        {
            return val;
        }
        return val.Substring(startIndex < 0 ? 0 : startIndex > (val.Length - 1) ? val.Length : startIndex);
    }

    public static String Substring(this String val, int startIndex, int length, bool handleIndexException)
    {
        if (!handleIndexException)
        { //handleIndexException is false so call the base method
            return val.Substring(startIndex, length);
        }
        if (string.IsNullOrEmpty(val))
        {
            return val;
        }
        int newfrom, newlth, instrlength = val.Length;
        if (length < 0) //length is negative
        {
            newfrom = startIndex + length;
            newlth = -1 * length;
        }
        else //length is positive
        {
            newfrom = startIndex;
            newlth = length;
        }
        if (newfrom + newlth < 0 || newfrom > instrlength - 1)
        {
            return string.Empty;
        }
        if (newfrom < 0)
        {
            newlth = newfrom + newlth;
            newfrom = 0;
        }
        return val.Substring(newfrom, Math.Min(newlth, instrlength - newfrom));
    }

我在2010年5月在http://jagdale.blogspot.com/2010/05/substring-extension-method-that-does.html

上对此发表了博客。

答案 10 :(得分:0)

部分出于概述的目的(不包括LINQ解决方案),下面的两个单行代码解决了/:id1/:id2 允许负值的注意事项以及空字符串的情况:

  1. int maxLength方式(来自Paul Ruane's answer):
Substring
  1. public static string Truncate(this string s, uint maxLength) => s?.Substring(0, Math.Min(s.Length, (int)maxLength)); 方式(来自kbrimington's answer):
Remove

答案 11 :(得分:0)

使用 C# 8

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

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

答案 12 :(得分:-4)

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