12

次の C# コードがあります。

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

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

ここでの問題は、次のエラー メッセージが表示されることです。

StartIndex を 0 未満にすることはできません。

なぜ、どうすれば修正できますか?

4

7 に答える 7

21

'.'インデックス 250 以降に文字がないため、このエラーが発生しているため、 がIndexOf返されます-1-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「。」がない場合 character - メソッド.Remove()は -1 を返します。

あなたのにもう1つの条件を追加することをお勧めしますif

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