public override string ToString() { IdentityHashSet <ICoreMap> calledSet = ToStringCalled.Value; if (calledSet == null) { calledSet = new IdentityHashSet <ICoreMap>(); } if (calledSet.Contains(this)) { return("[...]"); } calledSet.Add(this); var s = new StringBuilder("["); for (int i = 0; i < psize; i++) { s.Append(keys[i].Name); s.Append('='); s.Append(values[i]); if (i < psize - 1) { s.Append(' '); } } s.Append(']'); bool createdCalledSet = calledSet == null || calledSet.IsEmpty(); if (createdCalledSet) { ToStringCalled.Dispose(); /*remove();*/ } else { // Remove the object from the already called set so that // potential later calls in this object graph have something // more description than [...] calledSet.Remove(this); } return(s.ToString()); }
public override int GetHashCode() { IdentityHashSet <ICoreMap> calledSet = HashCodeCalled.Value; bool createdCalledSet = (calledSet == null); if (createdCalledSet) { calledSet = new IdentityHashSet <ICoreMap>(); HashCodeCalled.Value = calledSet; } if (calledSet.Contains(this)) { return(0); } calledSet.Add(this); int keysCode = 0; int valuesCode = 0; for (int i = 0; i < psize; i++) { keysCode += (i < keys.Length && values[i] != null ? keys[i].GetHashCode() : 0); valuesCode += (i < values.Length && values[i] != null ? values[i].GetHashCode() : 0); } if (createdCalledSet) { HashCodeCalled.Value = null; } else { // Remove the object after processing is complete so that if // there are multiple instances of this CoreMap in the overall // object graph, they each have their hash code calculated. // TODO: can we cache this for later? calledSet.Remove(this); } return(keysCode * 37 + valuesCode); }