在不改变C#顺序的情况下对scala列表进行排序等效于C#

我正在尝试使用scala中的字符串集合对列表进行排序,其结果应与C#列表结果相同。 但是对于以下数据,C#以不同的顺序返回结果,scala以不同的顺序返回结果。 任何人都可以告诉我,对于任何类型的字符串,这两种语言的结果是谁?

C#代码:

List list = new List(); list.Add("bmw_sip"); list.Add("bmw_mnt"); list.Add("bmw1"); list.Add("bmw"); list.Sort(); foreach (String data in list) { Console.Write(data+" "); } 

输出:

 bmw bmw_mnt bmw_sip bmw1 

斯卡拉代码:

 var list = List("bmw_sip", "bmw_mnt", "bmw1", "bmw") list.sorted 

输出:

 List[String] = List(bmw, bmw1, bmw_mnt, bmw_sip) 

Scala在List[String]sorted的实现最终使用java.lang.String定义的compareTo方法,该方法执行字典比较(如文档详细解释)。

'1''_'的Unicode值实际上分别为49和95:

 "_" compareTo "1" // Int = 46 

另一方面,C#中的Sort()使用Comparer.Default执行区域设置敏感的比较。 您可以使用Collator在scala中获得相同的结果:

 val ord = Ordering.comparatorToOrdering(java.text.Collator.getInstance) List("bmw_sip", "bmw_mnt", "bmw1", "bmw").sorted(ord) // List[String] = List(bmw, bmw_mnt, bmw_sip, bmw1) 

并且只是与前面的例子有关

 ord.compare("_", "1") // Int = -1 

请注意,这种排序取决于当前的语言环境(就像它在原始C#代码中所做的那样)

为了完整起见,如果您想在C#中执行字典比较,则必须使用StringComparer.Ordinal

 list.Sort(StringComparer.Ordinal); 

您可以使用list.Sort()方法来执行此操作。 Sort()方法调用默认比较器,如果要更改它的排序方式,请参阅http://msdn.microsoft.com/en-us/library/234b841s(v=vs.110).aspx