Как я могу найти все элементы, начинающиеся с или? - PullRequest
2 голосов
/ 01 июня 2010

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

Это не работает для французского. Если я выберу букву 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 ]

3 голосов
/ 01 июня 2010

Вы можете легко удалить диакритические знаки (акценты, умлаут, седилья и т. Д.) Из строки, чтобы проверить только базовый символ. Это делается путем нормализации строки в форме D Unicode и удаления символа категории «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 голос
/ 01 июня 2010

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

0 голосов
/ 01 июня 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...