首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.net - Array.Sort和Array.BinarySearch的问题-文化和全球化

.net - Array.Sort和Array.BinarySearch的问题-文化和全球化
EN

Stack Overflow用户
提问于 2009-04-19 21:38:28
回答 3查看 1.3K关注 0票数 1

我需要对包含单词列表的数组进行排序,并使用二进制搜索进行相同的搜索。由于某些原因,单词列表必须始终使用"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”?

我相信我可以:

代码语言:javascript
复制
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。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-04-19 22:02:05

不可能使用不变量文化吗?

InvariantCulture检索不变区域性的实例。它与英语有关,但与任何国家/地区无关。

使用不变的区域性会使这件事变得微不足道。

代码语言:javascript
复制
Array.Sort( myArray, Comparer.DefaultInvariant );

Array.BinarySearch( myArray, myString, Comparer.DefaultInvariant );
票数 5
EN

Stack Overflow用户

发布于 2009-04-19 22:06:40

好吧,这两种方法的答案都是实现一个比较器。创建一个实现IComparer(Of String)接口并具有自己的CultureInfo对象的类,该对象用于比较字符串:

代码语言:javascript
复制
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

现在您可以使用它对字符串进行排序:

代码语言:javascript
复制
Array.Sort(theArray, New StringComparerEnUs())

找到他们:

代码语言:javascript
复制
pos = BinarySearch(theArray, "Dent, Arthur", new StringComparerEnUs())

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

票数 6
EN

Stack Overflow用户

发布于 2009-04-19 22:02:38

试试这个:

代码语言:javascript
复制
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);
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/766150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档