我需要对包含单词列表的数组进行排序,并使用二进制搜索进行相同的搜索。由于某些原因,单词列表必须始终使用"en-US“的排序规则(即”美国区域设置“)进行排序。代码将在各种国际操作系统下运行,当然,这将意味着单词列表将根据使用中的本地区域设置进行不同的排序。在使用立陶宛区域设置运行的计算机/设备上可能会出现一个问题。为什么?因为在大多数语言中,字母"Y“的排序方式类似于X-Y-Z,而在立陶宛语中,排序顺序是I-Y-J。这种行为会给我的程序造成破坏。
在台式电脑上,我可以随时将“区域设置”更改为美式英语,方法是:
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
但是,由于我正在为Windows (CF.NET)开发,这段代码无法实现。
我发现了一些可以让我以编程方式更改设备上的区域设置的黑客,但它们并不是“正式的”,而且被认为是危险的,所以我更喜欢避免这些。
因此,我的问题是:在对设备上设置的区域设置进行排序和搜索时,如何强制Array.Sort和Array.BinarySearch使用CultureInfo =“en”?
我相信我可以:
Public Shared Function BinarySearch(Of T) ( _
array As T(), _
value As T, _
comparer As IComparer(Of T) _
) As Integer并实现比较器考虑CultureInfo (并将其设置为"en-US"),但我不知道如何做,尽管努力。如果有人可以在VB.Net或C#中发布一些示例代码,或者解释一下如何做到这一点,我将非常感激。
如果您知道任何在CF.Net中工作的替代解决方案,那么,当然,我会全神贯注地倾听。
谢谢。
编辑:
我会考虑Twanfosson的答案是被接受的解决方案,因为我的问题清楚地表明,我想保持与英语的联系。
然而,在灵活性方面,我相信古法的回答是最好的。为什么?让我们使用另一个例子:在德语中,字母被排序为-X,而在瑞典和芬兰语中,顺序是X。爱沙尼亚语的排序顺序是Z--X.很复杂,不是吗?Guffa的解决方案将允许我强制瑞典排序顺序(改变CultureInfo)在德国地区的设置下运行的设备。在这种情况下,使用Comparer.DefaultInvariant及其与英语的关联将于事无补,的字母可能会以O结尾,因此我将投票给Guffa。
发布于 2009-04-19 22:02:05
不可能使用不变量文化吗?
InvariantCulture检索不变区域性的实例。它与英语有关,但与任何国家/地区无关。
使用不变的区域性会使这件事变得微不足道。
Array.Sort( myArray, Comparer.DefaultInvariant );
Array.BinarySearch( myArray, myString, Comparer.DefaultInvariant );发布于 2009-04-19 22:06:40
好吧,这两种方法的答案都是实现一个比较器。创建一个实现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调用中添加一个变量来使用String.Compare参数。)
发布于 2009-04-19 22:02:38
试试这个:
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);
}
}https://stackoverflow.com/questions/766150
复制相似问题