Поскольку SortedSet
не обеспечивает прямой доступ по индексу, вы должны полагаться на перечисление (линейный поиск - O (п)). Возможно, лучшим способом является использование SortedSet.GetViewBetween и Last
, но это не похоже на то, что вы можете получить последний элемент без перечисления всех элементов в поле зрения.
Коллекция с прямым доступом по индексу (т.е. List
) позволит вам сделать бинарный поиск с O (Lg п) производительность - так что если вам нужно искать много копирования в список мог с ToList
дать лучшую производительность при использовании List.BinarySearch (которые дают вам позицию следующего элемента тому, который вы ищете).
// starting sample for BinarySearch approach
// not handling case where item not in the list (x = 1).
// List have to be sorted which is the case starting from sorted set: sortedSet.ToList()
var list = new List<int>{ 1,3, 5, 7, 8,9};
var index = list.BinarySearch(8);
Console.WriteLine(index < 0 ? list[~index - 1] : list[index-1]);
Стоит отметить, что список должен быть заказан перед выполнением BinarySearch - из раздела примечаний на странице msdn: «Список уже должен быть отсортирован в соответствии с реализацией сравнения, в противном случае результат будет неправильным». –
@zohar OP начинается с SortedSet, поэтому ToList в такой коллекции будет производить отсортированный список. Действительно, если начать с некоторых других данных, сортировка будет первым шагом, но это будет еще хуже, чем оригинальный линейный поиск. –
Я полностью согласен с вами, поэтому я поддержал ваш ответ, но это то, что я думаю, стоит упомянуть - ваш пример не использовал '.ToList()' на упорядоченном наборе ... –