Крошечный способ получить первые 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
Выглядит хорошо для меня, будучи действительно придирчивым, я заменил бы "..." ссылкой на сущность "…"
Ответ 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 в свое приложение, чтобы вы могли использовать функцию "Влево".