Java和C#/.NET之间的一致字符串排序

Java和C#/.NET之间的一致字符串排序,java,c#,sorting,locale,case-insensitive,Java,C#,Sorting,Locale,Case Insensitive,我有一个Java程序,它发出一个街道名称列表。名称应不区分大小写排序。消费者是一个C#应用程序,它使用列表进行二进制搜索算法,因此它必须使用完全相同的顺序 确切的排序并不十分重要,尽管按字母顺序排序,或者根据(德语)语言环境排序会更好 我未能在两个平台之间找到一对匹配的“不区分大小写的字符串比较器对象”。到目前为止,我得到的最好结果是: java:String.不区分大小写\u顺序 .NET:StringComparer.OrdinalIgnoreCase 但他们对“ü”和“ß”的比较持不同

我有一个Java程序,它发出一个街道名称列表。名称应不区分大小写排序。消费者是一个C#应用程序,它使用列表进行二进制搜索算法,因此它必须使用完全相同的顺序

确切的排序并不十分重要,尽管按字母顺序排序,或者根据(德语)语言环境排序会更好

我未能在两个平台之间找到一对匹配的“不区分大小写的字符串比较器对象”。到目前为止,我得到的最好结果是:

  • java:
    String.不区分大小写\u顺序
  • .NET:
    StringComparer.OrdinalIgnoreCase
但他们对“ü”和“ß”的比较持不同意见(见注1)

更具体的地区/文化(如
DE DE
)在处理空格和特殊字符方面有所不同

我可以为Java和.NET选择哪一对不区分大小写的比较器/命令/排序器,它们适用于每个给定的Unicode字符串

(由于几个原因,toLower/toUpper不是一个选项)

注1: 我假设Java在比较序数值之前做了一个toLower,而C#做了一个toUpper:

U+00C4  LATIN CAPITAL LETTER A WITH DIAERESIS (U+00C4)  Ä
U+00D6  LATIN CAPITAL LETTER O WITH DIAERESIS (U+00D6)  Ö
U+00DC  LATIN CAPITAL LETTER U WITH DIAERESIS (U+00DC)  Ü

U+00DF  LATIN SMALL LETTER SHARP S (U+00DF)     ß

U+00E4  LATIN SMALL LETTER A WITH DIAERESIS (U+00E4)    ä
U+00F6  LATIN SMALL LETTER O WITH DIAERESIS (U+00F6)    ö
U+00FC  LATIN SMALL LETTER U WITH DIAERESIS (U+00FC)    ü

直到最近还没有,所以还没有实现使用它——而且它也不能解决上述问题。

在c端编写自己的函数,这贯穿了每个字母<代码>如果它是ASCII字符,则将其按顺序放置在ASCII字符的子列表中<代码>如果它是一个德文字母(我很确定有一个集合),请将其放入UTF子列表中。这将导致定义的顺序(ASCII的第一个,äößü…第二个)。 为此:

List<YourType> temp = new List<YourType>();
int ASCIIcounter = 0;
int UTFcounter = 0;

foreach(YourType inc in yourList)
{
    if (ListASCII.contains(inc.yourSringData))
    { 
        temp.insert(inc, ASCIIcounter); ASCIIcounter++; UTFcounter++;
    }
    else 
    { 
         temp.insert(inc, UTFcounter); UTFcounter++; 
    }
}
temp.sort(0, ASCIIcoutner, null);
temp.sort(ASCIIcounter + 1, UTFcounter, null);
List temp=new List();
int ascicounter=0;
int UTFcounter=0;
foreach(列表中的YourType inc)
{
if(listscii.contains(inc.yourSringData))
{ 
临时插入(inc,ASCICounter);ASCICounter++;UTFcounter++;
}
其他的
{ 
温度插入(inc,UTFcounter);UTFcounter++;
}
}
临时排序(0,ASCIIcoutner,null);
临时排序(ASCICounter+1,UTFcounter,null);

在c#端编写自己的函数,它贯穿每个字母<代码>如果它是ASCII字符,则将其按顺序放置在ASCII字符的子列表中<代码>如果它是一个德文字母(我很确定有一个集合),请将其放入UTF子列表中。这将导致定义的顺序(ASCII的第一个,äößü…第二个)。 为此:

List<YourType> temp = new List<YourType>();
int ASCIIcounter = 0;
int UTFcounter = 0;

foreach(YourType inc in yourList)
{
    if (ListASCII.contains(inc.yourSringData))
    { 
        temp.insert(inc, ASCIIcounter); ASCIIcounter++; UTFcounter++;
    }
    else 
    { 
         temp.insert(inc, UTFcounter); UTFcounter++; 
    }
}
temp.sort(0, ASCIIcoutner, null);
temp.sort(ASCIIcounter + 1, UTFcounter, null);
List temp=new List();
int ascicounter=0;
int UTFcounter=0;
foreach(列表中的YourType inc)
{
if(listscii.contains(inc.yourSringData))
{ 
临时插入(inc,ASCICounter);ASCICounter++;UTFcounter++;
}
其他的
{ 
温度插入(inc,UTFcounter);UTFcounter++;
}
}
临时排序(0,ASCIIcoutner,null);
临时排序(ASCICounter+1,UTFcounter,null);

你可以在.NET-worth中尝试
InvariantIgnoreCase
消费者是一个C应用程序,它使用列表进行二进制搜索算法,因此它必须使用完全相同的顺序。你能在C端再次对数据排序以避免问题吗?你是说
InvariantCultureIgnoreCase
?这将在拉丁字母表中对Umlauts(äöüß)进行排序,而Java将它们排序到末尾。-行号用作在其他数据结构中查找表的键,因此我可能不会在接收器端更改它们的顺序。您可以尝试在.NET-worth中使用
InvariantIgnoreCase
go
消费者是一个C应用程序,它使用列表进行二进制搜索算法,因此,它必须使用完全相同的顺序。
您能在C端对数据再次排序以避免问题吗?您的意思是
不变量文化识别码
?这将在拉丁字母表中对Umlauts(äöüß)进行排序,而Java将它们排序到末尾。-行号用作在其他数据结构中查找表的键,因此我可能不会在接收方更改它们的顺序。这并没有回答我对比较器的请求,也没有解释它如何与任何Java实现匹配。该实现异常缓慢,并且没有解释
temp.sort
如何处理大小写不敏感。我不知道
listscii.contains()
如何处理整个字符串。什么是
YourType
?这并没有回答我对比较器的要求,也没有解释它如何匹配任何Java实现。该实现异常缓慢,并且没有解释
temp.sort
如何处理大小写不敏感。我不知道
listscii.contains()
如何处理整个字符串。你的类型是什么?