我需要对包含单词列表的数组进行排序,并使用binarysearch对其进行搜索。由于某些原因,必须始终使用“ en-US”的排序规则(即美国区域设置)对单词表进行排序。该代码将在各种国际操作系统下运行,当然,这意味着单词列表将根据使用的本地区域设置进行不同排序。使用立陶宛区域设置运行的计算机/设备可能会出现一个问题。为什么?因为大多数语言中的字母“ Y”的排序方式类似于X-Y-Z,而在立陶宛语中,排序顺序为I-Y-J。这种行为会对我的程序造成破坏。
在台式机上,我可以使用以下方法将区域设置暂时更改为美式英语:
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(“ en-US”)
但是,由于我正在开发Windows Mobile(CF.NET),因此无法实现这段代码。
[我发现了一些黑客,可以让我通过编程方式更改设备上的区域设置,但它们不是“官方的”,并且被认为具有风险,因此我更喜欢避免使用这些。
所以我的问题是:无论设备上设置了什么区域设置,如何在排序和搜索时强制Array.Sort和Array.BinarySearch使用CultureInfo =“ en-US”?
我相信我可以使用:
Public Shared Function BinarySearch(Of T) ( _
array As T(), _
value As T, _
comparer As IComparer(Of T) _
) As Integer
并实施Comparer以考虑CultureInfo(并将其设置为“ en-US”),但是尽管努力,我也不知道该怎么做。如果有人可以在VB.Net或C#中发布一些示例代码或如何做的解释,我将不胜感激。
[如果您知道在CF.Net中可用的任何替代解决方案,那么,我当然会感到无所适从。
谢谢。
编辑:
我将Twanfosson的答案视为可接受的解决方案,因为我的问题明确表明我想保持与英语的联系。
但是,我认为,在灵活性方面,Guffa的答案是最好的答案。为什么?我们再举一个例子:在德语中,字母[[Ö排序为Ö-X-Z,而在瑞典语和芬兰语中,顺序为X-Z-Ö。在爱沙尼亚语中,排序顺序为Z-Ö-X。很复杂,不是吗? Guffa的解决方案使我可以在德语区域设置下运行的设备上强制使用瑞典语排序顺序(更改CultureInfo)。在这种情况下,使用Comparer.DefaultInvariant及其与英语的关联将无济于事,可能字母Ö以O结尾。因此,我的投票将投向Guffa。
InvariantCulture检索实例不变文化。它是与英语相关但不适用于任何国家/地区。
使用不变的文化将使这变得无关紧要。
Array.Sort( myArray, Comparer.DefaultInvariant );
Array.BinarySearch( myArray, myString, Comparer.DefaultInvariant );
IComparer(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
调用中添加变量以使用ignore-case参数)。] >