我有一个按照第一个字母分组的项目列表。通过单击一个字母,用户可获得以该字母开头的条目。
这对法语不起作用。如果我选择字母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>
<% } %>
<% } %>
答案 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()
电话,因为您已经有资金来源。