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不能小于零。
为什么以及如何修复?
由于索引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)) + "...";
}
}