public QueryOperatorEnumerator <TResult, int>[] GetPartitions(int partitionCount) { int count = ((this.m_count + partitionCount) - 1) / partitionCount; QueryOperatorEnumerator <TResult, int>[] enumeratorArray = new QueryOperatorEnumerator <TResult, int> [partitionCount]; int index = 0; for (int i = 0; index < partitionCount; i += count) { if ((i + count) > this.m_count) { enumeratorArray[index] = new RepeatEnumerator <TResult>(this.m_element, (i < this.m_count) ? (this.m_count - i) : 0, i); } else { enumeratorArray[index] = new RepeatEnumerator <TResult>(this.m_element, count, i); } index++; } return(enumeratorArray); }
//----------------------------------------------------------------------------------- // Retrieves 'count' partitions, dividing the total count by the partition count, // and having each partition produce a certain number of repeated elements. // public QueryOperatorEnumerator <TResult, int>[] GetPartitions(int partitionCount) { // Calculate a stride size. int stride = (_count + partitionCount - 1) / partitionCount; // Now generate the actual enumerators. Each produces 'stride' elements, except // for the last partition which may produce fewer (if '_count' isn't evenly // divisible by 'partitionCount'). QueryOperatorEnumerator <TResult, int>[] partitions = new QueryOperatorEnumerator <TResult, int> [partitionCount]; for (int i = 0, offset = 0; i < partitionCount; i++, offset += stride) { if ((offset + stride) > _count) { partitions[i] = new RepeatEnumerator(_element, offset < _count ? _count - offset : 0, offset); } else { partitions[i] = new RepeatEnumerator(_element, stride, offset); } } return(partitions); }