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

时间:2009-04-19 21:38:28

标签: c# .net vb.net windows-mobile compact-framework

我需要对包含单词列表的数组进行排序,并使用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。< / p>

3 个答案:

答案 0 :(得分:6)

嗯,两者的答案都是实现比较器。创建一个实现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

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

Array.Sort(theArray, New StringComparerEnUs())

并找到它们:

pos = BinarySearch(theArray, "Dent, Arthur", new StringComparerEnUs())

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

答案 1 :(得分:5)

是否无法使用Invariant文化?

  

InvariantCulture检索实例   不变的文化。它是   与英语相关联   但没有任何国家/地区。

使用不变的文化会使这变得微不足道。

Array.Sort( myArray, Comparer.DefaultInvariant );

Array.BinarySearch( myArray, myString, Comparer.DefaultInvariant );

答案 2 :(得分:1)

试试这个:

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);
  }
}