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

时间:2014-08-18 11:12:04

标签: c# scala sorting

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

C#代码:

List<String> list = new List<String>();
    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

Scala代码:

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

输出:

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

2 个答案:

答案 0 :(得分:7)

Scala在sorted上对List[String]的实施最终使用compareTo定义的java.lang.String方法,该方法执行字典比较(详见{{3 }})。

'1''_'的{​​{3}}实际上分别为49和95:

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

另一方面,C#中的Sort()使用Comparer<String>.Default执行区域设置敏感的比较。您可以使用doc

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

答案 1 :(得分:-1)

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