/// <summary>
 /// Provides deep intersection-equality testing for two collections
 /// </summary>
 /// <param name="continuation">Continuation to operate on</param>
 /// <param name="expected">Expected values</param>
 /// <param name="customMessageGenerator">Generates a custom message to add to failure messages</param>
 /// <param name="customEqualityComparers">Custom implementations of IEqualityComparer&lt;TProperty&gt;
 /// to use when comparing properties of type TProperty</param>
 /// <typeparam name="T">Original type of collection</typeparam>
 public static void To <T>(
     this ICollectionIntersectionEquivalent <T> continuation,
     IEnumerable <T> expected,
     Func <string> customMessageGenerator,
     params object[] customEqualityComparers
     )
 {
     continuation.AddMatcher(
         collection =>
     {
         var actualArray   = collection as T[] ?? collection.ToArray();
         var expectedArray = expected as T[] ?? expected.ToArray();
         var result        = CollectionsAreIntersectionEquivalent(
             actualArray,
             expectedArray,
             customEqualityComparers);
         return(new MatcherResult(
                    result.AreEqual,
                    FinalMessageFor(
                        () => new[]
         {
             "Expected",
             actualArray.LimitedPrint(),
             $"{result.AreEqual.AsNot()} to be intersection equivalent to",
             expectedArray.LimitedPrint()
         }.Concat(result.Errors).ToArray(),
                        customMessageGenerator
                        )
                    ));
     });
 }
 /// <summary>
 /// Provides deep intersection-equality testing for two collections
 /// </summary>
 /// <param name="continuation">Continuation to operate on</param>
 /// <param name="expected">Expected values</param>
 /// <param name="customEqualityComparers">Custom implementations of IEqualityComparer&lt;TProperty&gt;
 /// to use when comparing properties of type TProperty</param>
 /// <typeparam name="T">Original type of collection</typeparam>
 public static void To <T>(
     this ICollectionIntersectionEquivalent <T> continuation,
     IEnumerable <T> expected,
     params object[] customEqualityComparers
     )
 {
     continuation.To(expected, NULL_STRING, customEqualityComparers);
 }
 /// <summary>
 /// Provides deep intersection-equality testing for two collections
 /// </summary>
 /// <param name="continuation">Continuation to operate on</param>
 /// <param name="expected">Expected values</param>
 /// <param name="customMessage">Custom message to add to failure messages</param>
 /// <param name="customEqualityComparers">Custom implementations of IEqualityComparer&lt;TProperty&gt;
 /// to use when comparing properties of type TProperty</param>
 /// <typeparam name="T">Original type of collection</typeparam>
 public static void To <T>(
     this ICollectionIntersectionEquivalent <T> continuation,
     IEnumerable <T> expected,
     string customMessage,
     params object[] customEqualityComparers
     )
 {
     continuation.To(expected, () => customMessage, customEqualityComparers);
 }