所以现在我想为OrderBy()创建一个自定义的lambda表达式,如下所示:
public static IOrderedEnumerable<TSource> ToOrderBy<TSource,TKey>( this IEnumerable<TSource> source,Func<TSource,TKey> keySelector) { if(source == null) return null; var seenKeys = new HashSet<TKey>(); var culture = new CultureInfo("pt-PT"); return source.OrderBy(element => seenKeys.Add(keySelector(element)),StringComparer.Create(culture,false)); }
但是,我收到此错误:
Error 2 The type arguments for method
‘System.Linq.Enumerable.OrderBy<TSource,TKey>(System.Collections.Generic.IEnumerable<TSource>,
System.Func<TSource,TKey>,
System.Collections.Generic.IComparer<TKey>)’ cannot be inferred from
the usage. Try specifying the type arguments explicitly.
似乎它不喜欢StringComparer.我怎么解决这个问题?
注意:
我已经尝试从here使用RemoveDiacritics()但我不知道在这种情况下如何使用该方法.所以我试着做一些像this这样的东西.
解决方法
不幸的是,我不确定如何判断一个角色是否是一个“重音字母”. RemoveDiacritics对我的é不起作用.
因此,我们假设您有一个名为IsAccentedLetter的方法,用于确定字符是否为重音字母:
public bool IsAccentedLetter(char c) { // I'm afraid this does NOT really do the job return CharUnicodeInfo.GetUnicodeCategory(c) == UnicodeCategory.NonSpacingMark; }
所以你可以这样排序你的列表:
string[] myStrings = getStrings(); // whereever your strings come from var ordered = myStrings.OrderBy(s => new string(s.Select(c => IsAccentedLetter(c) ? ' ' : c).ToArray()),false));
lambda表达式接受一个字符串并返回相同的字符串,但用空格替换带重音的字母.
OrderBy现在按这些字符串对您的枚举进行排序,因此“忽略”重音字母.
更新:如果你有一个工作方法RemoveDiacritics(字符串s)返回字符串,并根据需要替换重音字母,你可以简单地调用OrderBy:
string[] mystrings = getStrings(); var ordered = myStrings.OrderBy(RemoveDiacritics,false));
原文地址:https://www.jb51.cc/csharp/99414.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。