12

我有以下 C# 代码:

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

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

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

StartIndex 不能小于零。

为什么以及如何解决?

4

7 回答 7

21

'.'您收到该错误是因为索引 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 个字符,并在可能的情况下中断一个句子。

于 2013-06-24T18:09:15.863 回答
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;
}

我希望这有帮助。

于 2013-06-24T18:29:14.600 回答
1

如果下面找不到'.' 它将返回 -1 这对于 RemoveAt 无效

ArticleContent.IndexOf('.', 250)
于 2013-06-24T18:09:43.483 回答
1

正如其他人所写 - 当你ArticleContent没有'。字符 - 方法.Remove()将返回 -1。

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

if (ArticleContent.Length > 260 && ArticleContent.Contains('.'))
{
    ArticleContent = ArticleContent.Remove(ArticleContent.IndexOf('.', 250)) + "...";
}
于 2013-06-24T18:11:49.053 回答
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)) + "...";
}
于 2013-06-24T18:12:49.153 回答
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), "...")
   }
}
于 2013-06-24T18:16:40.770 回答
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)) + "...";
    }
}
于 2013-06-24T18:16:49.363 回答