mos*_*r67 1 .net c# vb.net compact-framework windows-mobile
我需要对包含单词列表的数组进行排序,并使用binarysearch进行搜索.出于某些原因,必须始终使用"en-US"的排序规则(即美国区域设置)对单词列表进行排序.该代码将在各种国际操作系统下运行,当然这意味着将根据使用的本地区域设置对单词列表进行不同的排序.使用立陶宛语区域设置运行的计算机/设备可能会出现一个问题.为什么?因为大多数语言中的字母" Y "在立陶宛语中被排序为X- Y -Z,所以排序顺序是I- Y -J.这种行为会对我的程序造成严重破坏.
在桌面PC上,我可以使用以下方法将区域设置暂时更改为美式英语:
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
Run Code Online (Sandbox Code Playgroud)
并实现Comparer以考虑CultureInfo(并将其设置为"en-US"),但我不知道如何努力,尽管努力.如果有人可以在VB.Net或C#中发布一些示例代码或者解释如何做,我将非常感激.
如果你知道任何可以在CF.Net中使用的替代解决方案,那么我当然都是耳朵.
谢谢.
编辑:
我会将Twanfosson的答案视为已接受的解决方案,因为我的问题清楚地表明我希望与英语保持联系.
然而,在灵活性方面,我相信Guffa的答案是最好的.为什么?让我们用另一个例子:在德语中,字母Ö按Ö- XZ 排序,而在瑞典语和芬兰语中,顺序是XZ- Ö.在爱沙尼亚语中,排序顺序是Z- Ö- X.复杂,不是吗?Guffa的解决方案将允许我在德国区域设置下运行的设备上强制使用瑞典语排序(更改CultureInfo).使用Comparer.DefaultInvariant及其与英语的关联在这种情况下无济于事,可能是字母Ö最终会以O.因此我的投票将转到Guffa.
那么,两者的答案都是实现一个比较器.创建一个实现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
Run Code Online (Sandbox Code Playgroud)
现在您可以使用它来对字符串进行排序:
Array.Sort(theArray, New StringComparerEnUs())
Run Code Online (Sandbox Code Playgroud)
并找到它们:
pos = BinarySearch(theArray, "Dent, Arthur", new StringComparerEnUs())
Run Code Online (Sandbox Code Playgroud)
(当然,通过在构造函数中接受文化字符串,可以使类更加通用,并且还可以添加变量以在String.Compare
调用中使用ignorecase参数.)
是不是可以使用不变文化?
InvariantCulture检索不变文化的实例.它与英语有关,但与任何国家/地区无关.
使用不变的文化将使这一点变得微不足道.
Array.Sort( myArray, Comparer.DefaultInvariant );
Array.BinarySearch( myArray, myString, Comparer.DefaultInvariant );
Run Code Online (Sandbox Code Playgroud)