Подтвердить что ты не робот

Имеет ли С# эквивалент std:: nth_element?

Я переношу код С++ на С#.

Имеет ли С# эквивалент std::nth_element() или мне нужно перевернуть его?

4b9b3361

Ответ 1

Я предполагаю, что вы ищете аксессуар, который возвращает N-й элемент неупорядоченной коллекции, выполняя частичную сортировку в коллекции. Это, как правило, полезно, когда у вас очень большая коллекция и заинтересованы в одном из первых элементов, основанных на некотором предикате порядка.

Насколько мне известно, ни расширения BC BC, ни LINQ не имеют эквивалента. Все методы сортировки (включая Enumerable.OrderBy) выполняют полный порядок сбора.

Если вам нужна эффективная версия Nth, вам нужно свернуть свой собственный метод расширения на IEnumerable, чтобы сделать это. Если вы собираетесь бросить свой собственный, вы можете посмотреть в алгоритм быстрого выбора, который имеет производительность O (n).

Если версия грубой силы достаточно, вы можете использовать LINQ:

var someCollection = new []{ 5, 2, 8, 9, 0, 1, 3, 12, 4 };

var fifthItem = someCollection.NthItem(5);

public static class NthExtensions 
{
    public static T NthItem(this IEnumerable<T> coll, int n) 
    {
        return coll.OrderBy(x => x).Skip(n - 1).First();
    }
}

Ответ 2

Нет, это не так. Вам придется написать алгоритм выбора (желательно быстрый выбор) вручную.

Ответ 3

Нет прямого эквивалента. Вы могли бы потенциально использовать LINQ OrderBy и Take/Skip для достижения тех же целей в любом IEnumerable, но вся коллекция будет отсортирована в этом процессе.