我怎样才能找到以a或?开头的所有项目?

时间:2010-06-01 17:14:13

标签: asp.net-mvc linq internationalization

我有一个按照第一个字母分组的项目列表。通过单击一个字母,用户可获得以该字母开头的条目。

这对法语不起作用。如果我选择字母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 个答案:

答案 0 :(得分:3)

您可以轻松地从字符串中删除变音符号(重音符号,变音符号,cedilla符号等),以仅测试基本字符。这是通过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 :(得分:1)

尝试使用i.ToString().ToUpper(StringComparison.InvariantCultureIgnoreCase)。它使用文化中性模型进行大小写转换,这应该消除重音。

答案 2 :(得分:0)

除了LBushkin的答案(我认为可行),你可以清理你的字母表。

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

然后你可以使用foreach循环并忘记整个c = i事物。此外,您不需要.ToUpper()电话,因为您已经有资金来源。