java - 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' 在 ':' 之前。
解决方案
这里的问题是,在 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...");
}
输出
推荐阅读
- java - JSON 有效负载的 Java 验证:以树的形式返回错误
- awk - awk/sed 删除重复并合并排列的列
- excel - ActiveSheet.PasteSpecial 有效,Transpose:=True 出错
- c# - 使用 c# 将文件上传到谷歌云存储
- excel - MindManager 不会显示 Excel 范围
- git - 重命名包含(本地)git 存储库的复制文件夹会导致 git 按预期停止工作吗?
- mongodb - 聚合匹配 $expr 与 $divide $mod 和 $floor 的组合不起作用
- redis - Redis占用更多内存
- r - 无边界的 R 序列生成
- jquery - 我想在 wordpress 中悬停时更改 img 的 url