我有以下C#代码:
ArticleContent = ds1.Tables[0].Rows[i]["ArticleContent"].ToString();
if (ArticleContent.Length > 260)
{
ArticleContent = ArticleContent.Remove(ArticleContent.IndexOf('.', 250)) + "...";
}
这里的问题是我收到此错误消息:
StartIndex不能小于零。
为什么以及如何解决?
答案 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)) + "...";
}
}