/// <summary> /// Examine if tit and tat are equal as sequenced collections /// using the specified item equalityComparer (assumed compatible with the two collections). /// </summary> /// <param name="collection1">The first collection</param> /// <param name="collection2">The second collection</param> /// <param name="itemequalityComparer">The item equalityComparer to use for comparison</param> /// <returns>True if equal</returns> public static bool StaticEquals(ISequenced <T> collection1, ISequenced <T> collection2, System.Collections.Generic.IEqualityComparer <T> itemequalityComparer) { if (object.ReferenceEquals(collection1, collection2)) { return(true); } if (collection1.Count != collection2.Count) { return(false); } //This way we might run through both enumerations twice, but //probably not (if the hash codes are good) if (collection1.GetSequencedHashCode() != collection2.GetSequencedHashCode()) { return(false); } using (System.Collections.Generic.IEnumerator <T> dat = collection2.GetEnumerator(), dit = collection1.GetEnumerator()) { while (dit.MoveNext()) { dat.MoveNext(); if (!itemequalityComparer.Equals(dit.Current, dat.Current)) { return(false); } } } return(true); }
public static bool SequencedEquals <T>(this ISequenced <T> first, ISequenced <T> second, SCG.IEqualityComparer <T> equalityComparer = null) { Ensures(Result <bool>() == (ReferenceEquals(first, second) || (first != null && second != null && first.SequenceEqual(second, equalityComparer)))); // Equal if reference equal - this is true for two nulls as well if (ReferenceEquals(first, second)) { return(true); } if (first == null || second == null) { return(false); } if (first.Count != second.Count) { return(false); } if (equalityComparer == null) { equalityComparer = SCG.EqualityComparer <T> .Default; } using (var e1 = first.GetEnumerator()) using (var e2 = second.GetEnumerator()) { // Enumerators are equally long while (e1.MoveNext() & e2.MoveNext()) { if (!equalityComparer.Equals(e1.Current, e2.Current)) { return(false); } } } return(true); }