2014-09-22 4 views
1

Есть ли альтернативы в PCL для SortedSet<T>? Или я должен реализовать свое?Альтернатива для SortedSet <T> в портативной библиотеке классов?

Мне нужен индексированный список не дублированных строк, который я могу выполнить для поиска в PCL, который поддерживает .NET 4.0. Мое текущее обходное решение заключается в том, чтобы полагаться на объект List<T>, вызывать его метод Sort и использовать метод BinarySearch. Это работает, но я надеялся, что смогу сделать лучше.

+1

Если вы переходите к [более новой версии документации] (http://msdn.microsoft.com/en-us/library/vstudio/dd412070%28v=vs.110%29.aspx), вы найдете что поддерживается PCL/Windows Phone/Windows Store. –

+0

@ PatrykĆwiek Спасибо, что указали это. Однако мне нужно поддерживать .NET 4.0. Я обновил вопрос. – Crono

+1

О, извините. Насколько я могу судить, вам не повезло, и вам придется либо использовать стороннее решение, либо развернуть свою собственную реализацию ... –

ответ

2

В этом профиле PCL нет «отсортированных» коллекций. Таким образом, вам нужно будет вызвать метод Sort в другой коллекции, чтобы отсортировать его или написать собственную сортированную коллекцию. Если вам нужна коллекция, вы можете использовать простой двоичный поиск/вставку для сортировки элементов по мере их добавления в коллекцию. Пример использования поддержки List<T> может выглядеть следующим образом:

public class SortedCollection<T> : ICollection<T> 
{ 
    private readonly List<T> collection = new List<T>(); 
    // TODO: initializable: 
    private readonly IComparer<T> comparer = Comparer<T>.Default; 

    public void Add(T item) 
    { 
     if (Count == 0) 
     { 
      collection.Add(item); 
      return; 
     } 
     int minimum = 0; 
     int maximum = collection.Count - 1; 

     while (minimum <= maximum) 
     { 
      int midPoint = (minimum + maximum)/2; 
      int comparison = comparer.Compare(collection[midPoint], item); 
      if (comparison == 0) 
      { 
       return; // already in the list, do nothing 
      } 
      if (comparison < 0) 
      { 
       minimum = midPoint + 1; 
      } 
      else 
      { 
       maximum = midPoint - 1; 
      } 
     } 
     collection.Insert(minimum, item); 
    } 

    public bool Contains(T item) 
    { 
     // TODO: potential optimization 
     return collection.Contains(item); 
    } 

    public bool Remove(T item) 
    { 
     // TODO: potential optimization 
     return collection.Remove(item); 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     return collection.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    public void Clear() 
    { 
     collection.Clear(); 
    } 

    public void CopyTo(T[] array, int arrayIndex) 
    { 
     collection.CopyTo(array, arrayIndex); 
    } 

    public int Count { get { return collection.Count; } } 
    public bool IsReadOnly { get { return false; } } 
} 

Я сделал минимум, чтобы получить отсортированный коллекцию, которая является функциональным. Вы можете оптимизировать так, чтобы Contains и Remove узнали, что список отсортирован и выполняет поиск O (log n) вместо O (n) ...

Существуют и другие алгоритмы, которые могут быть быстрее; но не намного больше, я выбрал простой и понятный алгоритм.

+2

Downvoter? Зачем комментировать? –

+1

FWIW, переименованный в 'SortedCollection', поскольку он не реализует' ISet '(и не мог) –

Смежные вопросы