Делает C#, имеют станд.:: эквивалентный nth_element?

Я портирую некоторый код C++ на C#.

Делает C#, имеют эквивалент std::nth_element() или я должен прокрутить свое собственное?

13
задан Drew Dormann 8 December 2016 в 00:06
поделиться

3 ответа

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

Насколько мне известно, ни расширения .NET BCL, ни 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();
    }
}
8
ответ дан 2 December 2019 в 00:58
поделиться

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

1
ответ дан 2 December 2019 в 00:58
поделиться

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

3
ответ дан 2 December 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: