2010-06-01 3 views
2

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

Это не работает для французского. Если я выберу букву a, элементы с â не возвращаются.

Что такое хороший способ вернуть предметы независимо от того, имеют ли они акцент или нет?

    <% char alphaStart = Char.Parse("A"); 
         char alphaEnd = Char.Parse("Z"); %> 
        <% for (char i = alphaStart; i <= alphaEnd; i++) { %> 
         <% char c = i; %> 
         <% var abcList = Model.FaqList.Where(x => x.CmsHeader.StartsWith(c.ToString())).ToList(); %> 
         <% if (abcList.Count > 0) { %> 
          <div class="naviPkt"> 
           <a id="<%= i.ToString().ToUpper() %>" class="naviPktLetter" href="#<%= i.ToString().ToLower() %>"><%= i.ToString().ToUpper() %></a> 
          </div> 
          <ul id="menuGroup<%= i.ToString().ToUpper() %>" class="contextMenu" style="display:none;"> 
           <% foreach (var info in abcList) { %> 
            <li class="<%= info.CmsHeader%>"> 
             <a id="infoId<%= info.CmsInfoId%>" href="#<%= info.CmsInfoId%>" class="abcEntry"><%= info.CmsHeader%></a> 
            </li> 
           <% } %>           
          </ul> 
         <% } %> 

        <% } %> 

ответ

3

Вы можете легко удалить диакритические знаки (акценты, умлаут, кедилла и т. Д.) Из строки, чтобы проверить только на базовом персонаже. Это делается в normalizing the string в форме Unicode D и удалении персонажа категории «NonSpacingMark». Следующий метод расширения полосы строку своих диакритических знаков:

public static string RemoveDiacritics(this string s) 
    { 
     if (s == null) 
      throw new ArgumentNullException("s"); 
     string formD = s.Normalize(NormalizationForm.FormD); 
     string noDiacriticsFormD = new string(
      formD.Where(c => CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) 
       .ToArray()); 
     string noDiacritics = noDiacriticsFormD.Normalize(NormalizationForm.FormC); 
     return noDiacritics; 
    } 

Используя этот метод, ваш код становится:

var abcList = Model.FaqList.Where(x => x.CmsHeader.RemoveDiacritics().StartsWith(c.ToString())).ToList(); 
1

Попробуйте использовать i.ToString().ToUpper(StringComparison.InvariantCultureIgnoreCase). Он использует нейтральную для культуры модель для конверсии случаев, которая должна устранять акценты.

+0

Это не сработало. Слова с â не были выбраны. –

0

В дополнение к ответу Л.Бушкина (который, как я думаю, будет работать), вы можете очистить свое поколение алфавита.

var A = Char.Parse("A"); 
var alphabet = Enumerable.Range(0, 26).Select(i => A + i); 

Затем вы можете использовать цикл Еогеасп и забыть обо всем c = i вещь. Также вам не нужны вызовы .ToUpper(), потому что у вас уже есть капитальные литеры.

Смежные вопросы