private void WrapPartitionedStreamHelper <TKey>(PartitionedStream <Pair <TInputOutput, NoKeyMemoizationRequired>, TKey> hashStream, IPartitionedStreamRecipient <TInputOutput> recipient, CancellationToken cancellationToken) { int partitionCount = hashStream.PartitionCount; PartitionedStream <TInputOutput, TKey> partitionedStream = new PartitionedStream <TInputOutput, TKey>(partitionCount, hashStream.KeyComparer, OrdinalIndexState.Shuffled); for (int i = 0; i < partitionCount; i++) { if (base.OutputOrdered) { partitionedStream[i] = new OrderedDistinctQueryOperatorEnumerator <TInputOutput, TKey>(hashStream[i], this.m_comparer, hashStream.KeyComparer, cancellationToken); } else { partitionedStream[i] = (QueryOperatorEnumerator <TInputOutput, TKey>) new DistinctQueryOperatorEnumerator <TInputOutput, TKey>(hashStream[i], this.m_comparer, cancellationToken); } } recipient.Receive <TKey>(partitionedStream); }
//--------------------------------------------------------------------------------------- // This is a helper method. WrapPartitionedStream decides what type TKey is going // to be, and then call this method with that key as a generic parameter. // private void WrapPartitionedStreamHelper <TKey>( PartitionedStream <Pair, TKey> hashStream, IPartitionedStreamRecipient <TInputOutput> recipient, CancellationToken cancellationToken) { int partitionCount = hashStream.PartitionCount; PartitionedStream <TInputOutput, TKey> outputStream = new PartitionedStream <TInputOutput, TKey>(partitionCount, hashStream.KeyComparer, OrdinalIndexState.Shuffled); for (int i = 0; i < partitionCount; i++) { if (OutputOrdered) { outputStream[i] = new OrderedDistinctQueryOperatorEnumerator <TKey>(hashStream[i], _comparer, hashStream.KeyComparer, cancellationToken); } else { outputStream[i] = (QueryOperatorEnumerator <TInputOutput, TKey>)(object) new DistinctQueryOperatorEnumerator <TKey>(hashStream[i], _comparer, cancellationToken); } } recipient.Receive(outputStream); }