StartIndex不能小于零。 - 尝试更改字符串时出错

时间:2013-06-24 18:06:52

标签: c# .net string

我有以下C#代码:

ArticleContent = ds1.Tables[0].Rows[i]["ArticleContent"].ToString();

if (ArticleContent.Length > 260)
{
   ArticleContent = ArticleContent.Remove(ArticleContent.IndexOf('.', 250)) + "...";
}

这里的问题是我收到此错误消息:

  

StartIndex不能小于零。

为什么以及如何解决?

7 个答案:

答案 0 :(得分:18)

您收到该错误是因为索引250上或之后没有'.'个字符,因此IndexOf会返回-1。然后,您尝试删除位置-1处的字符,该字符会显示您所看到的错误。

同时意识到Remove仅删除该位置的一个字符,而不是该位置后的所有内容。我想要你想要的是:

if (ArticleContent.Length > 260)
{
   int lastPeriod = ArticleContent.LastIndexOf('.');
   if(lastPeriod < 0)
      lastPeriod = 257;  // just replace the last three characters
   ArticleContent = ArticleContent.Substring(0,lastPeriod) + "...";
}

这会在字符串中添加省略号,确保它不再是260个字符,如果可能的话会破坏句子。

答案 1 :(得分:3)

很明显为什么它失败了,但你到底想要做什么?如果只是将字符串截断为特定长度并指示截断,我可能会建议下面列出的扩展方法。它的用法很简单:

ArticleContent = ArticleContent.Truncate(250);

截断扩展方法:

public static string Truncate(this string pThis, int pLength)
{
    if (string.IsNullOrEmpty(pThis))
        return pThis;

    if (0 >= pLength)
        return string.Empty;

    var lTruncatedString = pThis;
    const string lEllipses = @"…";

    if (pThis.Length > pLength)
    {
        var lSubstringLength = Math.Max(pLength - lEllipses.Length, 0);
        lTruncatedString = pThis.Substring(0, lSubstringLength) + lEllipses;
        if (lTruncatedString.Length > pLength)
            lTruncatedString = lTruncatedString.Substring(0, pLength);
    }

    return lTruncatedString;
}

我希望这会有所帮助。

答案 2 :(得分:1)

如果以下情况无法找到&#39;。&#39;它将返回-1,这对于RemoveAt

无效
ArticleContent.IndexOf('.', 250)

答案 3 :(得分:1)

正如其他人写的那样 - 当你的ArticleContent没有'时'。' character - 方法.Remove()将返回-1。

我建议您在if中添加一个条件:

if (ArticleContent.Length > 260 && ArticleContent.Contains('.'))
{
    ArticleContent = ArticleContent.Remove(ArticleContent.IndexOf('.', 250)) + "...";
}

答案 4 :(得分:0)

有可能没有。在250号位之后。你需要先检查一下:

ArticleContent = ds1.Tables[0].Rows[i]["ArticleContent"].ToString();

var periodPosition = ArticleContent.IndexOf('.', 250);
if (ArticleContent.Length > 260 && periodPosition >= 0)
{
   ArticleContent = ArticleContent.Remove(ArticleContent.IndexOf('.', 250)) + "...";
}

答案 5 :(得分:0)

错误来源: '.'在索引250后没有出现。IndexOf方法在这种情况下返回-1。

虽然其他人刚刚确定了错误的来源,但我也会对您的问题进行修复。

解决方案:使用LastIndexOf方法:

if (ArticleContent.Length > 260)
{
   if (ArticleContent.Remove(ArticleContent.LastIndexOf('.') != -1)
   {
       ArticleContent = String.Concat(ArticleContent.Remove(ArticleContent.LastIndexOf('.')), "...");
   }
   else
   {
       ArticleContent = String.Concat(ArticleContent.Substring(0, 257), "...")
   }
}

答案 6 :(得分:0)

ArticleContent = ds1.Tables[0].Rows[i]["ArticleContent"].ToString();
if (ArticleContent.Length > 260)
{
    if (ArticleContent.Substring(250).Contains("."))
    {
        ArticleContent = ArticleContent.Remove(ArticleContent.IndexOf('.', 250)) + "...";
    }
    else
    {
        ArticleContent = ArticleContent.Remove(ArticleContent.Substring(0, 250)) + "...";
    }
}