1

我有一堆生成的标题文本,它们都有不同.Length的但在字符串的特定起始索引处我想找到最近的空格,然后删除它后面的文本以及空格,然后添加“...”。

最重要的部分是它不应该延长 49 长度

例子:

"What can UK learn from Spanish high speed rail when its crap"

我想确保它变成:

"What can UK learn from Spanish high speed rail..."

到目前为止,我创建了

if (item.title.Length >= 49)
{
    var trim = item.title.Substring(' ', 49) + "...";
}

但是这个可以做以下事情:

"What can UK learn from Spanish high speed rail it..."

这是错误的。

任何形式的帮助或任何关于如何实现这一目标的提示都值得赞赏。

4

2 回答 2

2

这应该在最后一个空格处修剪,它还处理允许部分中没有空格的情况:

public static string TrimLength(string text, int maxLength)
{
    if (text.Length > maxLength)
    {
        maxLength -= "...".Length;
        maxLength = text.Length < maxLength ? text.Length : maxLength;
        bool isLastSpace = text[maxLength] == ' ';
        string part = text.Substring(0, maxLength);
        if (isLastSpace)
            return part + "...";
        int lastSpaceIndexBeforeMax = part.LastIndexOf(' ');
        if (lastSpaceIndexBeforeMax == -1)
            return part + "...";
        else
            return text.Substring(0, lastSpaceIndexBeforeMax) + "...";
    }
    else
        return text;
}

演示

英国可以从西班牙高铁中学到什么...

于 2013-05-08T21:32:24.417 回答
0

干得好。如果你有非常大的单词,这种方法可能会失败,但它应该让你开始。

public static string Ellipsify(string source, int preferredWidth)
{
    string[] words = source.Split(' '); //split the sentence into words, separated by spaces
    int readLength = 0;
    int stopAtIndex = 0;
    for(int i = 0; i < words.Length; i++) {
        readLength += words[i].Length; //add the current word's length
        if(readLength >= preferredWidth) { //we've seen enough characters that go over the preferredWidth
            stopAtIndex = i;
            break;
        }
        readLength++; //count the space
    }
    string output = "";
    for(int i = 0; i < stopAtIndex; i++)
    {
        output += words[i] + " ";
    }
    return output.TrimEnd() + "..."; //add the ellipses
}
于 2013-05-08T21:38:50.437 回答