2 votes

Comment puis-je trouver tous les éléments commençant par a ou â ?

J'ai une liste d'articles qui sont regroupés par leur première lettre. En cliquant sur une lettre, l'utilisateur obtient toutes les entrées qui commencent par cette lettre.

Cela ne fonctionne pas pour le français. Si je choisis la lettre a, les éléments avec â ne sont pas renvoyés.

Quel est le bon moyen de renvoyer des articles, qu'ils aient un accent ou non ?

                 <%  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>
                        <% } %>

                    <% } %>

3voto

Thomas Levesque Points 141081

Vous pouvez facilement supprimer les signes diacritiques (accents, tréma, cédille, etc.) de la chaîne pour ne tester que le caractère de base. Ceci est fait par normalisation de la chaîne de caractères à la forme Unicode D et en supprimant le caractère de la catégorie "NonSpacingMark". La méthode d'extension suivante dépouille une chaîne de caractères de ses signes diacritiques :

    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;
    }

En utilisant cette méthode, votre code devient :

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

1voto

LBushkin Points 60611

Essayez d'utiliser i.ToString().ToUpper(StringComparison.InvariantCultureIgnoreCase) . Il utilise un modèle culturellement neutre pour la conversion des cas, ce qui devrait éliminer les accents.

0voto

Ryan Points 2982

En plus de la réponse de LBushkin (qui, je pense, fonctionnera), vous pouvez nettoyer votre génération d'alphabet.

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

Ensuite, vous pouvez utiliser une boucle foreach et oublier toute l'histoire de la c = i chose. Vous n'avez pas besoin non plus de la .ToUpper() appelle parce que vous avez déjà des lettres majuscules.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X