public IEnumerable<Range> Divide(int partCount)
{
if (partCount == 0)
throw new ArgumentOutOfRangeException("partCount");
if (partCount < Count)
yield return this;
int countOfOnePart = Count/partCount;
for (int i = 0; i < partCount - 1; i++)
{
yield return new Range(Index + i * countOfOnePart, countOfOnePart);
}
//Last range can contains more elements than others, for example: Range(0, 10).Divide() = {Range(0, 3), Range(3,3), Range{6, 4)}.
int processedElementsCount = countOfOnePart*(partCount - 1);
yield return new Range(Index + processedElementsCount, Count - processedElementsCount);
}