【问题标题】:C# Sort vs Java Collections.Sort giving different results [duplicate]C#Sort vs Java Collections.Sort给出不同的结果[重复]
【发布时间】:2020-03-19 19:20:10
【问题描述】:

C# 代码:

public class Test
{
    public static void Main()
    {
        List<string> list = new List<string> { "johnsmith@mail.com", "john_newyork@mail.com", "john00@mail.com" };
        list.Sort();
        for(int i=0;i<list.Count;i++){
            Console.WriteLine(list[i]);
        }

    }
}

结果:

john_newyork@mail.com

john00@mail.com

johnsmith@mail.com

Java 代码:

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        List<String> list = new ArrayList<String>();
        list.add("johnsmith@mail.com");
        list.add("john_newyork@mail.com");
        list.add("john00@mail.com");
        Collections.sort(list);
        System.out.println(list);
    }
}

结果:

[john00@mail.com, john_newyork@mail.com, johnsmith@mail.com]

'_' 的 Ascii 值为 95,'0' 的 ascii 值为 48。因此,理想情况下,在字符串排序中,'0' 应位于 '_' 之前。为什么 C# 将 '_' 排序在 '0' 之前?

但是当我尝试比较字符“_”和“0”时。两种语言都能正确比较,并在 '_' 之前保留 '0'。

Console.WriteLine('0'>'_'); -> False (C#)
System.out.println('0'>'_'); -> false (Java)

【问题讨论】:

    标签: java c# sorting collections


    【解决方案1】:

    在 c# 中,您可以使用 StringComparer 来指定字符串之间的比较应该如何工作。要实现与 Java 相同的行为,您需要使用 StringComparer.Ordinal

    using System;
    using System.Collections.Generic;
    
    namespace ConsoleApp
    {
        public class Test
        {
            public static void Main()
            {
                var list = new List<string> { "johnsmith@mail.com", "john_newyork@mail.com", "john00@mail.com" };
                list.Sort(StringComparer.Ordinal);
                foreach (var element in list)
                {
                    Console.WriteLine(element);
                }
            }
        }
    }
    

    这会在控制台上打印以下内容:

    john00@mail.com
    john_newyork@mail.com
    johnsmith@mail.com
    

    有关详细示例,另请参阅documentation on Microsoft Docs

    【讨论】:

      【解决方案2】:

      要按 ASCII 值排序,请使用 StringComparer.Ordinal

      list.Sort(StringComparer.Ordinal);

      【讨论】:

      • 谢谢。在没有任何 StringComparer 的情况下,list.sort() 默认如何工作?
      • @soup_boy 这就像你打电话给list.Sort(StringComparer.CurrentCulture)
      • 顺便说一句,您可以将 Java 更改为按文化信息排序,但 Java 似乎没有 Comparator&lt;String&gt; 的任何常量,因此您必须实现自己的使用 java.text.Collator (使用它的 .getInstance 方法)进行字符串比较。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 2013-05-02
      • 2018-06-04
      • 1970-01-01
      • 2016-12-05
      • 2017-03-23
      • 2021-12-28
      相关资源
      最近更新 更多