Ответ 1
В решении Jeff есть несколько вещей, которые могут быть улучшены.
if (String.IsNullOrEmpty(title)) return "";
ИМХО, а не место для проверки этого. Если функция получает пустую строку, в любом случае что-то всерьез ошибочно. Выбросьте ошибку или вообще не реагируйте.
// remove any leading or trailing spaces left over
… muuuch later:
// remove trailing dash, if there is one
Дважды работа. Учитывая, что каждая операция создает целую новую строку, это плохо, даже если производительность не является проблемой.
// replace spaces with single dash
title = Regex.Replace(title, @"\s+", "-");
// if we end up with multiple dashes, collapse to single dash
title = Regex.Replace(title, @"\-{2,}", "-");
Опять же, в основном дважды работа: во-первых, используйте регулярное выражение для замены сразу нескольких пространств. Затем снова используйте регулярное выражение, чтобы сразу заменить несколько тире. Два выражения для синтаксического анализа, два автомата для построения в памяти, повторяются дважды по строке, создают две строки: все эти операции могут быть свернуты на один.
Сверху моей головы, без каких-либо испытаний, это будет эквивалентное решение:
// make it all lower case
title = title.ToLower();
// remove entities
title = Regex.Replace(title, @"&\w+;", "");
// remove anything that is not letters, numbers, dash, or space
title = Regex.Replace(title, @"[^a-z0-9\-\s]", "");
// replace spaces
title = title.Replace(' ', '-');
// collapse dashes
title = Regex.Replace(title, @"-{2,}", "-");
// trim excessive dashes at the beginning
title = title.TrimStart(new [] {'-'});
// if it too long, clip it
if (title.Length > 80)
title = title.Substring(0, 79);
// remove trailing dashes
title = title.TrimEnd(new [] {'-'});
return title;
Обратите внимание, что этот метод использует строковые функции вместо функций регулярных выражений и char вместо строковых функций, когда это возможно.