我有一个自定义类Customer的列表,我想按标题按字母顺序对它们进行排序。 所以我写了
myList = myList.OrderByDescending(x => x.Title).ToList<Customer>();
现在问题是这种方法不支持瑞典方式对字母å,ä,ö进行排序。它们应该出现在字母z之后的末尾,但它们不会出现。
所以我做了一个解决方法,在排序之前替换了瑞典字母,然后在之后更改它们。它看起来像这样,但它很慢。有人能想出更好的方法吗?
private List<Customer> OrderBySwedish(List<Customer> myList)
{
foreach (var customer in myList)
{
customer.Title = customer.Title.Replace("å", "zzz1").Replace("ä", "zzz2").Replace("ö", "zzz3").Replace("Å", "Zzz1").Replace("Ä", "Zzz2").Replace("Ö", "Zzz3");
}
myList= myList.OrderBy(x => x.Title).ToList<Customer>();
foreach (var customer in myList)
{
customer.Title = customer.Title.Replace("zzz1", "å").Replace("zzz2", "ä").Replace("zzz3", "ö").Replace("Zzz1", "Å").Replace("Zzz2", "Ä").Replace("Zzz3", "Ö");
}
return myList;
}
答案 0 :(得分:20)
您可以使用特定文化StringComparer
,请参阅here。
CultureInfo culture = new CultureInfo("sv-SE");
var result = myList.OrderByDescending(x =>
x.Title, StringComparer.Create(culture, false));
答案 1 :(得分:4)
将Thread.CurrentCulture属性设置为正确的文化。
答案 2 :(得分:1)
我的情况: _My排序列表的值已编码。这使我的订单不正确。添加解码解决我的问题!
答案 3 :(得分:0)
我发现有一个类似问题的解决方法是使用一个辅助字段来保存转换后的数据版本
在我的情况下,我们有person.Name
和person.SearchName
,其中SearchName
被Name
转换为没有变音符号。
但这只是最好的方法(AFAIK),因为我们想要快速的数据库搜索/过滤,然后只实例化相关结果。
如果你已经有了内存中的对象,我会建议你采用其他方法之一;并且不这一个。