2009-04-19 66 views
1

我需要对包含单词列表的数组进行排序,并使用binarysearch搜索相同的单词。由于某些原因,单词列表必须始终使用“en-US”的排序规则排序,即美国地区设置。该代码将在各种国际操作系统下运行,当然这将意味着根据使用的本地区域设置,单词列表将根据不同进行排序。在运行立陶宛区域设置的计算机/设备上可能会出现一个问题。为什么?由于在大多数语言中的字母“Y”是按照X- Y -Z排序的,而在立陶宛语中,排序顺序是I-Y -J。这种行为会对我的程序造成破坏。.net - Array.Sort和Array.BinarySearch问题 - 文化和全球化

在一个台式电脑,我可以通过暂时改变区域设置为美国英语:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture( “EN-US”)

然而

,因为我正在为Windows Mobile(CF.NET)开发,这段代码不可能实现。

我发现一些黑客可以让我以编程方式更改设备上的区域设置,但他们不是“官方”,并认为有风险,所以我宁愿避免这些。

所以我的问题是:如何强制Array.Sort和Array.BinarySearch使用CultureInfo =“en-US”时排序和搜索无论设备上设置的区域设置?

我相信我可以使用:

​​

和实施的Comparer考虑到的CultureInfo(并将其设置为“EN-US”),但我不知道该怎么做,尽管努力。如果任何人都可以在VB.Net或C#中发布一些示例代码或者解释如何去做,我将非常感激。

如果您了解CF.Net中的任何其他解决方案,那么我当然会全力以赴。

谢谢。

编辑:

我会考虑Twanfosson的答案,因为我的问题接受的解决方案明确指出,我想保持与英语语言关联。

但是,为了灵活性,我相信Guffa的答案是最好的。为什么?我们再举一个例子:在德语中,字母Ö被排序为Ö -X-Z,而在瑞典语和芬兰语中,顺序是X-Z- Ö。在爱沙尼亚语中,排序顺序是Z-Ö -X。复杂,不是吗? Guffa的解决方案将使我能够在德国区域设置下运行的设备上强制瑞典语排序(更改CultureInfo)。使用Comparer.DefaultInvariant及其与英语的关联在这种情况下不会有帮助,可能信Ö将以O结束。因此,我的投票将转到Guffa。

回答

5

是不可能使用Invariant文化?

InvariantCulture检索不变文化的实例 。与英文 相关的是 ,但不是与任何国家/地区。

使用不变文化会使这个微不足道。

Array.Sort(myArray, Comparer.DefaultInvariant); 

Array.BinarySearch(myArray, myString, Comparer.DefaultInvariant); 
1

试试这个:

class EnglishComparer : IComparer<string> 
{ 
    static CultureInfo __english = new CultureInfo("en-US"); 

    public int Compare(string x, string y) 
    { 
    return string.Compare(x, y, __english, CompareOptions.None); 
    } 
} 
6

那么,答案既要实现一个比较器。创建一个实现IComprarer(Of String)接口,并具有其使用比较字符串它自己CultureInfo对象的类:

Public Class StringComparerEnUs 
    Implements IComparer(Of String) 

    Private _culture As CultureInfo 

    Public Sub New() 
     _culture = New CultureInfo("en-US") 
    End Sub 

    Public Function Compare(ByVal x As String, ByVal y As String) 
     Return String.Compate(x, y, false, _culture) 
    End Function 

End Class 

现在你可以用它来串排序:

Array.Sort(theArray, New StringComparerEnUs()) 

,并找到他们:

pos = BinarySearch(theArray, "Dent, Arthur", new StringComparerEnUs()) 

(当然这个类可以更普遍一点通过接受在构造一个文化字符串,你还可以添加变量以利用String.Compare调用中的ignorecase参数。)