首页 > 解决方案 > C# 字典(顺序键)与 Java SortedMap 字典顺序

问题描述

我在 Java 中使用 SortedMap 并尝试按键订购 C# 字典。比较输出我希望看到相同的订单,但是订单不同,我不知道为什么。

SortedMap<String, String> orderedByKey = new TreeMap<>();
orderedByKey.put("0:10", "");
orderedByKey.put("10:12+", "");
orderedByKey.put("2:10", "");
orderedByKey.put("1:10", "");
orderedByKey.put("10:1", "");
Dictionary<string, string> tmp = new Dictionary<string, string>();
tmp.Add("0:10", "");
tmp.Add("10:12+", "");
tmp.Add("2:10", "");
tmp.Add("1:10", "");
tmp.Add("10:1", "");
var orderedByKey = tmp.OrderBy(y => y.Key).ToDictionary(y => y.Key, y => y.Value);

Java 对它们的排序如下...

0:10 10:1 10:12+ 1:10 2:10

C#

0:10 1:10 10:1 10:12+ 2:10

我在这里想的是,我的 C# 排序已经订购了字典,但使用了与 Java 不同的先例,即 C# 认为 ':' 在 '0' 之前,而在 Java 中,'0' 在 ':' 之前。

标签: javac#

解决方案


这里的问题是,在 C# 中,String.CompareTo默认情况下会考虑文化String.compareTo,这与使用纯字典比较的 Java 方法提供的结果略有不同。

如果您希望 C# 字符串比较表现得像 Java,那么我们可以简单地指定StringComparer.Ordinal为比较类型,它只比较每个字符的序号位置:

private static void Main()
{
    Dictionary<string, string> tmp = new Dictionary<string, string>
    {
        {"0:10", ""},
        {"10:12+", ""},
        {"2:10", ""},
        {"1:10", ""},
        {"10:1", ""}
    };

    var javaSorted = tmp.OrderBy(item => item.Key, StringComparer.Ordinal)
        .ToDictionary(i => i.Key, i => i.Value);

    Console.WriteLine(string.Join(", ", javaSorted.Select(item => item.Key)));

    GetKeyFromUser("\nDone! Press any key to exit...");
}

输出

在此处输入图像描述


推荐阅读