Крошечный способ получить первые 25 символов

Может ли кто-нибудь подумать о более удобном способе сделать следующее:

public string ShortDescription
{
    get { return this.Description.Length <= 25 ? this.Description : this.Description.Substring(0, 25) + "..."; }
}

Мне бы хотелось просто создать string.Substring(0, 25), но он выдает исключение, если строка меньше длины.

Ответ 1

Мне так часто нужно было, я написал для него метод расширения:

public static class StringExtensions
{
    public static string SafeSubstring(this string input, int startIndex, int length, string suffix)
    {
        // Todo: Check that startIndex + length does not cause an arithmetic overflow - not that this is likely, but still...
        if (input.Length >= (startIndex + length))
        {
            if (suffix == null) suffix = string.Empty;
            return input.Substring(startIndex, length) + suffix;
        }
        else
        {
            if (input.Length > startIndex)
            {
                return input.Substring(startIndex);
            }
            else
            {
                return string.Empty;
            }
        }
    }
}

если вам это нужно только один раз, это слишком много, но если вам это нужно чаще, это может пригодиться.

Изменить: добавлена ​​поддержка суффикса строки. Перейдите в "...", и вы получите свои эллипсы на более коротких строках или передайте в string.Empty без специальных суффиксов.

Ответ 2

return this.Description.Substring(0, Math.Min(this.Description.Length, 25));

Не имеет части .... На самом деле ваш путь, вероятно, самый лучший.

Ответ 3

public static Take(this string s, int i)
{
    if(s.Length <= i)
        return s
    else
        return s.Substring(0, i) + "..."
}

public string ShortDescription
{
    get { return this.Description.Take(25); }
}

Ответ 4

То, как вы это сделали, кажется мне прекрасным, за исключением того, что я использовал магическое число 25, у меня было бы это как константа.

Вы действительно хотите сохранить это в своем bean? Предположительно это для отображения где-нибудь, поэтому ваш рендеринг должен быть тем, что делает усечение вместо объекта данных

Ответ 5

Ну, я знаю, что ответ уже принят, и я могу распят за то, что выбрал здесь регулярное выражение, но так я обычно это делаю:

//may return more than 25 characters depending on where in the string 25 characters is at
public string ShortDescription(string val)
{
    return Regex.Replace(val, @"(.{25})[^\s]*.*","$1...");
}
// stricter version that only returns 25 characters, plus 3 for ...
public string ShortDescriptionStrict(string val)
{
    return Regex.Replace(val, @"(.{25}).*","$1...");
}

Он имеет приятное преимущество, не сокращая слова пополам, так как он всегда останавливается после первого символа пробела за 25 символами. (Конечно, если вам нужно, чтобы усечь текст, входящий в базу данных, это может быть проблемой.

Даунсайд, я уверен, что это не самое быстрое решение.

ИЗМЕНИТЬ: заменить & hellip; с "...", так как не уверен, что это решение для Интернета!

Ответ 6

без... это должно быть кратчайшее:

public string ShortDescription
{
    get { return Microsoft.VisualBasic.Left(this.Description;}
}

Ответ 7

Я думаю, что подход звучит, хотя я бы рекомендовал несколько настроек

  • Переместите магическое число в const или значение конфигурации
  • Используйте обычный if условный, а не тернарный оператор
  • Используйте string.Format("{0}...") вместо + "..."
  • Есть только одна точка возврата из функции

Итак:

public string ShortDescription
{
    get
    {
        const int SHORT_DESCRIPTION_LENGTH = 25;

        string _shortDescription = Description;

        if (Description.Length > SHORT_DESCRIPTION_LENGTH)
        {
            _shortDescription = string.Format("{0}...", Description.Substring(0, SHORT_DESCRIPTION_LENGTH));
        }

        return _shortDescription;
    }
}

Для более общего подхода вам может потребоваться переместить логику в метод расширения:

public static string ToTruncated(this string s, int truncateAt)
{
    string truncated = s;

    if (s.Length > truncateAt)
    {
        truncated = string.Format("{0}...", s.Substring(0, truncateAt));
    }

    return truncated;
}

Изменить

Я использую тернарный оператор экстенсивно, но предпочитаю избегать его, если код становится достаточно подробным, что он начинает распространяться более чем на 120 символов или около того. В этом случае я хотел бы обернуть его на несколько строк, поэтому найдите, что обычный if условный текст более читабельен.

Edit2

Для типографской корректности вы также можете использовать символ многоточия (...) в отличие от трех точек/периодов/полных остановок (...).

Ответ 8

Один из способов сделать это:

int length = Math.Min(Description.Length, 25);
return Description.Substring(0, length) + "...";

Есть две строки вместо одной, но более короткие:).

Изменить: Как указано в комментариях, это дает вам... все время, поэтому ответ был неправильным. Исправление означает, что мы вернемся к исходному решению.

На этом этапе я думаю, что использование расширений строк является единственным вариантом для сокращения кода. И это имеет смысл только тогда, когда этот код повторяется, по крайней мере, в нескольких местах...

Ответ 9

Выглядит хорошо для меня, будучи действительно придирчивым, я заменил бы "..." ссылкой на сущность "&hellip;"

Ответ 10

Я не могу думать ни о чем, но ваш подход может быть не лучшим. Вы добавляете логику представления в свой объект данных? Если это так, я предлагаю вам поставить эту логику в другом месте, например, статический класс StringDisplayUtils с помощью метода GetShortStringMethod (int maxCharsToDisplay, string stringToShorten).

Однако этот подход может и не быть большим. Как насчет разных шрифтов и наборов символов? Вам нужно будет начать измерять фактическую длину строки в пикселях. Проверьте свойство AutoEllipsis на классе Label класса winform (вам будет необходимо установить AutoSize на false, если вы используете это). Свойство AutoEllipsis, когда true, сократит строку и добавит вам символы "...".

Ответ 11

Я бы придерживался того, что у вас есть tbh, но как альтернатива, если у вас есть LINQ для объектов, вы могли бы

new string(this.Description.ToCharArray().Take(25).ToArray())

//And to maintain the ...
+ (this.Description.Length <= 25 ? String.Empty : "...")

Как говорили другие, вы, вероятно, захотите сохранить 25 в постоянном

Ответ 12

Вы должны увидеть, можете ли вы ссылаться на DLL Microsoft.VisualBasic в свое приложение, чтобы вы могли использовать функцию "Влево".