gpt4 book ai didi

c# - .net - Array.Sort 和 Array.BinarySearch 的问题 - 文化和全局化

转载 作者:太空宇宙 更新时间:2023-11-03 17:29:08 29 4
gpt4 key购买 nike

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

在台式 PC 上,我可以使用以下命令将区域设置暂时更改为美式英语:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("zh-CN")

但是,由于我是为 Windows Mobile (CF.NET) 开发的,所以这段代码无法实现。

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

所以我的问题是:无论设备上设置的区域设置如何,如何在排序和搜索时强制 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 的回答视为可接受的解决方案,因为我的问题清楚地表明我想保持与英语的联系。

但是,就灵 active 而言,我认为 Guffa 的答案是最好的。为什么?再举个例子:在德语中,字母 Ö 的排序是 Ö-X-Z,而在瑞典语和芬兰语中,字母的顺序是 X-Z-Ö。在爱沙尼亚语中,排序顺序为 Z-Ö-X。很复杂,不是吗? Guffa 的解决方案将让我在德国区域设置下运行的设备上强制执行瑞典语排序顺序(更改 CultureInfo)。使用 Comparer.DefaultInvariant 及其与英语的关联在这种情况下无济于事,字母 Ö 可能以 O 结尾。因此我将投票给 Guffa。

最佳答案

好吧,两者的答案都是实现一个比较器。创建一个实现 IComparer(Of String) 接口(interface)并拥有自己的用于比较字符串的 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())

(当然,可以通过在构造函数中接受文化字符串来使该类更通用一些,您还可以添加一个变量以在 ignoreCase 参数中使用 String.Compare 调用。)

关于c# - .net - Array.Sort 和 Array.BinarySearch 的问题 - 文化和全局化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/766150/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com