2017-01-28 3 views
1

Я пытаюсь решить проблему, в которой было бы полезно иметь структуру данных, какC# не имеет SortedList <T>?

var list = new SortedList<int>(); 
list.Add(3); // list = { 3 } 
list.Add(1); // list = { 1, 3 } 
list.Add(2); // list = { 1, 2, 3 } 
int median = list[list.Length/2]; 

т.е.

  • О (п) вставки
  • O (1) поиск по индекс

но я не вижу, что такое существует? Я вижу, что есть некоторые запутывающие SortedList<T,U>, а затем интерфейс SortedList, но ни один из них не является тем, что я ищу.

+0

https://www.tutorialspoint.com/csharp/csharp_sortedlist.htm? – Waffles

+0

См. Http://stackoverflow.com/questions/3663613/why-is-there-no-sortedlistt-in-net –

+0

Возможный дубликат [Почему в .NET нет ссылки SortedList ?] (Http: // stackoverflow. com/questions/3663613/why-is-there-no-sortedlistt-in-net) –

ответ

0

Сортированный список в .NET framework представляет собой ассоциативный список (то есть для пар ключ/значение). Вы можете использовать обычный List<T>, если вы используете его функцию бинарного поиска, которая работает, если вы всегда держите список отсортированным. Вы можете инкапсулировать в метод расширения:

static class SortedListExtensions { 
    public static void SortedAdd<T>(this List<T> list, T value) { 
     int insertIndex = list.BinarySearch(value); 
     if (value < 0) { 
      value = ~value; 
     } 
     list.Insert(insertIndex, value); 
    } 

    //Added bonus: a faster Contains method 
    public static bool SortedContains<T>(this List<T> list, T value) { 
     return list.BinarySearch(value) >= 0; 
    } 
} 


List<int> values = new List<int>(); 
values.SortedAdd(3); 
values.SortedAdd(1); 
values.SortedAdd(2); 
Смежные вопросы