gpt4 book ai didi

c# - 带有 Java 的 Map、Set、HashMap 的 .NET 端口

转载 作者:搜寻专家 更新时间:2023-11-01 02:52:46 26 4
gpt4 key购买 nike

我正在 .NET 中移植 Java 代码,但我卡在了以下行中(在 .NET 中表现异常)。

Java:

Map<Set<State>, Set<State>> sets = new HashMap<Set<State>, Set<State>>();

Set<State> p = new HashSet<State>();

if (!sets.containsKey(p)) { ... }

等效的 .NET 代码可能是:

IDictionary<HashSet<State>, HashSet<State>> sets = new Dictionary<HashSet<State>, HashSet<State>>();

HashSet<State> p = new HashSet<State>();

if (!sets.containsKey(p)) { /* (Add to a list). Always get here in .NET (??) */ }

但是代码比较失败,程序认为“sets”从不包含Key“p”,最终导致OutOfMemoryException。

也许我遗漏了什么,Java 和 .NET 之间的对象相等性和身份可能不同。

我尝试在类 State 中实现 IComparable 和 IEquatable,但结果是一样的。

编辑:

代码的作用是:如果集合不包含键“p”(这是一个 HashSet),它将在 LinkedList> 的末尾添加“p”。

State 类 (Java) 是一个简单的类,定义为:

public class State implements Comparable<State> {

boolean accept;
Set<Transition> transitions;

int number;
int id;

// ...

public int compareTo(State s) {
return s.id - id;
}

public boolean equals(Object obj) {
return super.equals(obj);
}

public int hashCode() {
return super.hashCode();
}

最佳答案

在 Java 中,列表和集合的实现会覆盖 equals等。等效的不会发生在 .NET 中。但是,您可以使用 HashSet<T>.CreateSetComparer 使用适当的相等比较器创建字典。并将其传递给 Dictionary像这样的构造函数:

IDictionary<HashSet<State>, HashSet<State>> sets =
new Dictionary<HashSet<State>, HashSet<State>>
(HashSet<State>.CreateSetComparer());

这是假设 State覆盖 Equals/GetHashCode并理想地实现 IEquatable<State>也是。

关于c# - 带有 Java 的 Map、Set、HashMap 的 .NET 端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8103643/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com