如果我执行以下语句:

string.Compare("mun", "mün", true, CultureInfo.InvariantCulture)

结果是“-1”,表明“门”具有比“门”的数值低。

然而,如果我执行此语句:

string.Compare("Muntelier, Schweiz", "München, Deutschland", true, CultureInfo.InvariantCulture)

我得到 '1',表明 '曼泰利耶,Schewiz' 应该去最后

这是在比较的错误?或者,更可能的是有规则我应该排序包含字符串时,可以考虑到重音的


究其原因,这是一个问题,我在整理列表,然后这样做的意思让每一个字符串包含“xxx”开头的手动二元过滤器。

以前我用的是Linq的“去哪儿”的方法,但现在我必须用另一个人写了这个自定义函数,因为他说,它的性能会更好。

但自定义功能似乎并没有考虑到任何“统一”的规则.NET了。所以,如果我告诉它通过“门”过滤器,它没有找到任何物品,即使有列表中的项目与“门”开始的。

这似乎是因为重音字符不一致排序,根据不同的重音字符后去什么字。


OK,我想我已经解决了这一问题。

的过滤器之前,我做基于所述第一排序名词的每个字符串,字母其中名词的是搜索字符串的长度。

有帮助吗?

解决方案

有是在工作平局决胜算法,请参阅 http://unicode.org/reports/tr10/

  

要解决的复杂性   语言敏感的排序中,   多层次比较算法是   采用。在比较两个词,对于   例如,最重要的特点是   基本字符:如   一个A和B之间的差异   雅绅特的差异通常是   忽略,如果有任何差异   在基本字母。案例差异   (大写与小写),是   通常被忽略,如果有任何   在基或修饰的差异。   标点符号是可变的。在一些   情况下一个标点符号是   像基字符处理。在   其他情况下,它应该被忽略   如果有任何碱,口音,或壳体   差异。也有可能是   最后,领带破水平,因此如果   有没有其他差别可言   在串,(归一化)码   点顺序被使用。

所以, “Munt ...” 和 “Münc...” 是按字母顺序不同和排序基于 “T” 和 “c”。

然而,“门”和“门”是按字母顺序相同(“U” equivelent在失去语言为“U”),以使字符代码相比较

其他提示

它看起来像只被在一种“抢七”的情况中使用的重音字符 - 换句话说,如果字符串是否则等于

下面是一些示例代码来演示:

using System;
using System.Globalization;

class Test
{
    static void Main()
    {
        Compare("mun", "mün");
        Compare("muna", "münb");
        Compare("munb", "müna");
    }

    static void Compare(string x, string y)
    {
        int result = string.Compare(x, y, true, 
                                   CultureInfo.InvariantCulture));

        Console.WriteLine("{0}; {1}; {2}", x, y, result);
    }
}

(我一直在尝试,“N”后加空格为好,看它是否是在字边界做了 - 它不是)

结果:

mun; mün; -1
muna; münb; -1
munb; müna; 1

我怀疑这是由各种复杂的Unicode规则正确的 - 但我不知道有足够的了解他们。

至于是否需要考虑这一点......我不希望这样。你在做什么是由该抛?

据我了解这一点,仍然有些一致。当使用CultureInfo.InvariantCulture比较元音变音字符ü被当作非重音字符u

如在第一个实施例的字符串明显是不相等的结果将不会是0,但-1(这似乎是一个默认值)。在第二个例子的曼泰利耶进入最后因为如下的 C 的字母表中。

我无法找到任何MSDN文档清晰解释这些规则,但我发现

string.Compare("mun", "mün", CultureInfo.InvariantCulture,  
    CompareOptions.StringSort);

string.Compare("Muntelier, Schweiz", "München, Deutschland", 
    CultureInfo.InvariantCulture, CompareOptions.StringSort);

给出所需的结果。

无论如何,我认为你会是好到你的基础上的特定文化排序,如当前用户的文化(如果可能)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top