// Есть построитель, который все это инициирует и строит public void Build() { min = KeyFunction(sequence.Element(start).Get()); max = KeyFunction(sequence.Element(start + number - 1).Get()); //TODO: Что-то надо делать при number == 0 // Особый случай, когда n_scale < 1 или min == max. Тогда делается одна ячейка и особая функция if (n_scale < 1 || min == max) { n_scale = 1; starts = new long[1]; starts[0] = start; ToPosition = (int key) => 0; } else { starts = new long[n_scale]; ToPosition = (int key) => (int)(((long)key - (long)min) * (long)(n_scale - 1) / (long)((long)max - (long)min)); } // Заполнение количеств элементов в диапазонах foreach (var ob in sequence.ElementValues(start, number)) { int key = KeyFunction(ob); int position = ToPosition(key); // Предполагаю, что начальная разметка массива - нули starts[position] += 1; } // Заполнение начал диапазонов long sum = start; for (int i = 0; i < n_scale; i++) { long num_els = starts[i]; starts[i] = sum; sum += num_els; } }