this.resultSelector = resultSelector;
}
+ // If strict is set to `true', the zip'ing process will throw if sequences length mistmatches
+ public bool Strict {
+ get;
+ set;
+ }
+
internal override IEnumerable<TResult> GetSequential ()
{
IEnumerable<TFirst> first = Parent.GetSequential ();
try {
while (eFirst.MoveNext ()) {
- if (!eSecond.MoveNext ())
- yield break;
+ if (!eSecond.MoveNext ()) {
+ if (Strict)
+ throw new QueryZipException ();
+ else
+ yield break;
+ }
yield return resultSelector (eFirst.Current, eSecond.Current);
}
+ if (Strict && eSecond.MoveNext ())
+ throw new QueryZipException ();
} finally {
eFirst.Dispose ();
eSecond.Dispose ();
try {
while (eFirst.MoveNext ()) {
- if (!eSecond.MoveNext ())
- break;
+ if (!eSecond.MoveNext ()) {
+ if (Strict)
+ throw new QueryZipException ();
+ else
+ break;
+ }
store1[index] = eFirst.Current;
store2[index] = eSecond.Current;
yield return new KeyValuePair<long, TResult> (store1[index].Key,
resultSelector (store1[index].Value, store2[index].Value));
}
+ if (Strict && eSecond.MoveNext ())
+ throw new QueryZipException ();
} finally {
barrier.RemoveParticipant ();
eFirst.Dispose ();
}
}
}
+
+ internal class QueryZipException : Exception
+ {
+ }
}
#endif
comparer = EqualityComparer<TSource>.Default;
var source = new CancellationTokenSource ();
- var innerQuery = first.Zip (second, comparer.Equals).WithImplementerToken (source);
+ var zip = new QueryZipNode<TSource, TSource, bool> (comparer.Equals, first.Node, second.Node) { Strict = true };
+ var innerQuery = new ParallelQuery<bool> (zip).WithImplementerToken (source);
bool result = true;
source.Cancel ();
}
});
+ } catch (AggregateException ex) {
+ if (ex.InnerException is QueryZipException)
+ return false;
+ else
+ throw ex;
} catch (OperationCanceledException e) {
if (e.CancellationToken != source.Token)
throw e;
Assert.IsFalse (data.AsReallyParallel ().All (x => x != 1));
Assert.IsTrue (empty.AsReallyParallel ().All (x => false));
}
+
+ [Test]
+ public void SequenceEqualsTest ()
+ {
+ var data1 = new int[] { 1, 2, 3 };
+ var data2 = new int[] { 1, 2, 4 };
+ var data3 = new int[] { 1, 2, 3, 4 };
+
+ Assert.IsTrue (data1.AsReallyParallel ().SequenceEqual (data1.AsReallyParallel ()));
+ Assert.IsTrue (data2.AsReallyParallel ().SequenceEqual (data2.AsReallyParallel ()));
+ Assert.IsTrue (data3.AsReallyParallel ().SequenceEqual (data3.AsReallyParallel ()));
+ Assert.IsFalse (data1.AsReallyParallel ().SequenceEqual (data2.AsReallyParallel ()));
+ Assert.IsFalse (data1.AsReallyParallel ().SequenceEqual (data3.AsReallyParallel ()));
+ Assert.IsFalse (data2.AsReallyParallel ().SequenceEqual (data3.AsReallyParallel ()));
+ }
}
}