我正在尝试为JObjects.
我很惊讶地看到他们没有覆盖该GetHashCode方法,因此,我不能将其用作唯一键。
由于我的 json 非常大,我不想JObject.ToString().GetHashCode用作解决方案。
我确实看到他们调用GetDeepHashCode了一个内部方法,但实现基于其他受保护的属性,因此,我无法“复制”代码并从中创建扩展方法。
我也不想使用反射并调用内部GetDeepHashCode方法。
我正在寻找一种为 a 创建唯一缓存键JObject的方法,并且我不希望该方法在性能方面变得格外昂贵。
您可以JTokenEqualityComparer.GetHashCode(JToken token)为此目的使用。它提供对GetDeepHashCode()您看到的方法的访问。
var obj = JToken.Parse(jsonString);
var comparer = new JTokenEqualityComparer();
var hashCode = comparer.GetHashCode(obj);
Run Code Online (Sandbox Code Playgroud)
请注意,JTokenEqualityComparer.Equals(JToken x, JToken y)调用JToken.DeepEquals()( source ) 因此此比较器适合用作IEqualityComparer<JToken>构建 LINQ-to-JSON 对象的哈希表或字典,并且需要值的唯一性。