当我将一些项添加到Java Hashtable
中时,它们的顺序与.NET Hashtable
的顺序不同。有什么方法可以确保.NET Hashtable
与Java Hashtable
具有相同的顺序吗?
我正在尝试将一些Java代码移植到C#。 Java代码使用Hashtable
来跟踪某些数据。当我检查 order 时,当我遍历Java Hashtable
或.NET Hashtable
(通过Enumerator
)时,检索数据一个具有相同数据,按相同顺序...但每个基于代码的具有不同的顺序。
我有什么方法可以使.NET Hashtable
数据与Java Hashtable
的顺序相同?
我知道Hashtable
没有处理订单 - 所以我觉得没有什么可以做的。我也无法将Java代码中的数据类型从...更改为Hashtable
。
以下是一些相同的数据来说明我的情况。
private Hashtable identifiers = new Hashtable();
...
identifiers.put(symbol, identifier);
private Hashtable Identifiers = new Hashtable();
...
Identifiers.Add(symbol, identifier);
有任何想法或建议吗?
答案 0 :(得分:8)
不幸的是,如果没有更改集合的类型,那么真的没办法解决这个问题。 Hashtables不保证订单(正如您在帖子中提到的那样)。
这一切归结为以下几点:
如果订单很重要,则Hashtable是错误的数据结构。
答案 1 :(得分:3)
除了提取密钥并以某种方式对其进行排序(或使用有序字典)之外,您无法更改此顺序。您未使用任何哈希表实现的迭代顺序,因此依赖于特定顺序意味着您的代码被破坏。 Java中的迭代顺序甚至不保证保持不变JDK的未来版本。
答案 2 :(得分:2)
通用散列表中的顺序是不可预测的。这就是你所经历的。如果您尝试运行比较测试,并且需要特定订单,则必须在 BOTH 两端使用有序地图。否则几乎没有办法预测输出。
答案 3 :(得分:1)
我同意其他答案,但仍然推荐使用Hashtable。您应该始终使用通用的Dictionary类。还有一个SortedDictionary,类名称全部。你可以反转或排序它的内容,看看Reverse Sorted Dictionary in .NET
答案 4 :(得分:1)
你可以在Java中使用LinkedHashMap,递归软件可以根据this post为C#提供一个。
我没有尝试过这个解决方案。
答案 5 :(得分:1)
这是一个糟糕的解决方案,但根据您的描述,您没有其他选择。
您可以获取Java Hastable
类的源代码并将它们移植到C#。删除所有不必要的东西,比如迭代器和keySet
,equals
,你将拥有相当小的类(我期望的几十行)。将它转换为C#应该是微不足道的。
当然,除了Java兼容性之外,不应该将此新类用于其他任何内容。并向原始应用程序供应商提交错误也可能很好:)
答案 6 :(得分:0)
您可以尝试在(在.NET中)实现自己的IHashCodeProvider和IComparer,并将它们传递给Hashtable构造函数。 从您发布的示例中可以看出,条目按键升序(.NET)和降序(Java)顺序排序,因此您需要一个反转订单的比较器。