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

本文关键字:字符串 出错 不能 小于 StartIndex | 更新日期: 2023-09-27 18:19:47

我有以下C#代码:

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

这里的问题是,我得到了这个错误消息:

StartIndex不能小于零。

为什么以及如何修复?

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

由于索引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个字符,并在可能的情况下打断一个句子。

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

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;
}

我希望这能有所帮助。

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

ArticleContent.IndexOf('.', 250)

正如其他人所写的那样,当您的ArticleContent没有"."字符方法.Remove()将返回-1。

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

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

错误源:'.'未出现在索引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), "...")
   }
}

有可能没有。在位置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)) + "...";
}
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)) + "...";
    }
}