вот еще один пример из предыдущего/подобного вопроса
public static IEnumerable<char> RemoveDiacriticsEnum(string src, bool compatNorm, Func<char, char> customFolding)
{
foreach(char c in src.Normalize(compatNorm ? NormalizationForm.FormKD : NormalizationForm.FormD))
switch(CharUnicodeInfo.GetUnicodeCategory(c))
{
case UnicodeCategory.NonSpacingMark:
case UnicodeCategory.SpacingCombiningMark:
case UnicodeCategory.EnclosingMark:
//do nothing
break;
default:
yield return customFolding(c);
break;
}
}
public static IEnumerable<char> RemoveDiacriticsEnum(string src, bool compatNorm)
{
return RemoveDiacritics(src, compatNorm, c => c);
}
public static string RemoveDiacritics(string src, bool compatNorm, Func<char, char> customFolding)
{
StringBuilder sb = new StringBuilder();
foreach(char c in RemoveDiacriticsEnum(src, compatNorm, customFolding))
sb.Append(c);
return sb.ToString();
}
public static string RemoveDiacritics(string src, bool compatNorm)
{
return RemoveDiacritics(src, compatNorm, c => c);
}
Здесь у нас есть значение по умолчанию для проблемных случаев, упомянутых выше, которое просто их игнорирует. Мы также отделили построение строки от генерации перечисления символов, поэтому нам не нужно быть расточительным в тех случаях, когда нет необходимости манипулировать строкой с результатом (скажем, мы собирались записать символы для вывода следующим или сделать некоторые дополнительные char посимвольная манипуляция).
Пример случая, когда мы хотели также преобразовать l и L в l и L, но не могли использовать другие специализированные задачи:
private static char NormaliseLWithStroke(char c)
{
switch(c)
{
case 'l':
return 'l';
case 'L':
return 'L';
default:
return c;
}
}
person
MethodMan
schedule
18.01.2012