2010-06-01 2 views
2

첫 번째 문자로 그룹화 된 항목 목록이 있습니다. 문자를 클릭하면 사용자는 해당 문자로 시작하는 alle 항목을 얻습니다.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

기본 문자에서만 테스트 할 문자열에서 발음 기호 (악센트, 움라우트, 세 딜라 등)를 쉽게 제거 할 수 있습니다. 유니 코드 형식 D에 normalizing the string을 입력하고 범주 "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

LBushkin의 답변 (내가 생각하는 것) 외에 알파벳 생성을 정리할 수 있습니다.

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

그러면 foreach 루프를 사용하여 전체 c = i 것을 잊어 버릴 수 있습니다. 또한 대문자가 이미 있기 때문에 .ToUpper() 전화가 필요하지 않습니다.

관련 문제