13

我有一个自定义类 Customer 的列表,我想按 Title 的字母顺序对它们进行排序。所以我写了

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;
    }
4

4 回答 4

27

您可以使用特定的文化StringComparer,请参见此处

CultureInfo culture = new CultureInfo("sv-SE");
var result = myList.OrderByDescending(x => 
               x.Title, StringComparer.Create(culture, false));
于 2011-08-29T11:30:44.013 回答
4

Thread.CurrentCulture属性设置为正确的区域性。

于 2011-08-29T11:32:40.723 回答
1

我的情况:_我的排序列表有值被编码。这使我的订单不正确。添加解码解决我的问题!

于 2016-10-21T04:06:51.227 回答
0

对于一个有点类似的问题,我发现的解决方法是有一个辅助字段来保存数据的转换版本。
就我而言,我们有person.Nameand person.SearchName, whereSearchNameName转换为没有变音符号。

但这只是最好的方法(AFAIK),因为我们想要快速的数据库搜索/过滤,然后只实例化相关结果。
如果您已经在内存中有对象,我建议您使用其他方法之一;而不是这个。

于 2011-08-29T11:36:31.000 回答