public static bool Equals <TKey>(IDataReader <TKey> reader1, IDataReader <TKey> reader2) { try { using var keys1 = reader1.Keys.GetEnumerator(); using var keys2 = reader2.Keys.GetEnumerator(); Loop: var m1 = keys1.MoveNext(); var m2 = keys2.MoveNext(); if (m1 != m2) { return(false); } if (m1) { var key1 = keys1.Current; var key2 = keys1.Current; var value1 = reader1[key1].DirectRead(); var value2 = reader2[key2].DirectRead(); if (Equals(key1, key2) && Equals(value1, value2)) { goto Loop; } return(false); } return(true); } catch { var obj1 = MessagePackFormatter.DeserializeObject <object>(MessagePackFormatter.SerializeObject(reader1)); var obj2 = MessagePackFormatter.DeserializeObject <object>(MessagePackFormatter.SerializeObject(reader2)); return(Equals(obj1, obj2)); } }