2010-06-01 32 views
2

我有一个按他们的第一个字母分组的项目列表。通过点击一个字母,用户可以获得以该字母开头的条目。如何查找所有以a或?开头的项目?

这不适用于法语。如果我选择字母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

您可以轻松地从字符串中删除变音符号(重音符号,元音变音符号,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

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

+0

这没有奏效。带有â的单词未被选中。 – 2010-06-02 07:49:57

0

除了LBushkin的答案(我认为它会工作),你可以清理你的字母表代。

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

然后你就可以使用foreach循环,而忘记了整个c = i事情。你也不需要拨打.ToUpper(),因为你已经有了资本账户。

相关问题