2015-01-31 2 views
3

Простая реализация ICollection<T> в .NET framework? То есть класс коллекции с возможностью добавления и удаления элементов, но без индексирования. Collection<T> определенно не подходит, так как он реализует IList, и поэтому к элементам может быть доступен индекс.Простая существующая реализация ICollection <T>

Разоблачение Collection<T> или List<T> как ICollection<T> не будет работать в моем случае тоже, потому что мне нужно, чтобы наследовать свой собственный класс от него, и класс наследуется от любого другого класса, который реализует IList<T> будет иметь индексацию, а также.

Я знаю, что это не очень важно реализовать, но просто подумал, что он должен уже существовать, искал, но не нашел ничего подобного.

+2

'IList' не упорядочена. –

+0

Согласен с Кори. 'IList ' - это просто интерфейс. Для заказа требуется реализация; нет ничего о 'IList ', который предполагает, что он упорядочен. Элементы, добавленные в 'Collection ', скорее всего хранятся в том же порядке, в котором вы их добавляете. –

+0

В .NET Framework нет коллекций, которые обеспечивают действительно случайный порядок элементов ... Просьба уточнить, что именно вы ищете, когда говорите, что List-like не работает, поскольку они «упорядочены». –

ответ

9

Вот список классов, реализующих ICollection<T> в System.Collections пространстве имен:

System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue> 
System.Collections.Generic.Dictionary<TKey, TValue> 
System.Collections.Generic.HashSet<T> 
System.Collections.Generic.LinkedList<T> 
System.Collections.Generic.List<T> 
System.Collections.Generic.SortedDictionary<TKey, TValue> 
System.Collections.Generic.SortedList<TKey, TValue> 
System.Collections.Generic.SortedSet<T> 
System.Collections.ObjectModel.Collection<T> 
System.Collections.ObjectModel.ReadOnlyCollection<T> 
System.Collections.ObjectModel.ReadOnlyDictionary<TKey, TValue> 
System.Collections.ObjectModel.WeakReadOnlyCollection<T> 

Но все эти реализации добавить дополнительные функциональные возможности, а так как вы хотите, чтобы наследовать от реализации, но только разоблачить ICollection<T> методы, с помощью любой из них на самом деле не вариант.

Единственный выбор, который у вас есть - это реализовать свои собственные. Это достаточно легко сделать. Вам просто нужно обернуть подходящую реализацию ICollection<T>.Вот один, который использует List<T> по умолчанию, но также позволяет производным классам использовать определенный тип ICollection<T>:

class SimpleCollection<T> : ICollection<T> 
{ 

    ICollection<T> _items; 


    public SimpleCollection() { 
     // Default to using a List<T>. 
     _items = new List<T>(); 
    } 

    protected SimpleCollection(ICollection<T> collection) { 
     // Let derived classes specify the exact type of ICollection<T> to wrap. 
     _items = collection; 
    } 

    public void Add(T item) { 
     _items.Add(item); 
    } 

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

    public bool Contains(T item) { 
     return _items.Contains(item); 
    } 

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

    public int Count 
    { 
     get { return _items.Count; } 
    } 

    public bool IsReadOnly 
    { 
     get { return false; } 
    } 

    public bool Remove(T item) 
    { 
     return _items.Remove(item); 
    } 

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

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return _items.GetEnumerator(); 
    } 
} 

Это выходит за пределы того, что вы после этого, но если, например, вы хотите уникальные предметы в хранить, вы могли бы извлечь из этого и обеспечить HashSet<T> как тип коллекции завернуть:

class UniqueCollection<T> : SimpleCollection<T> 
{ 
    public UniqueCollection() : base(new HashSet<T>()) {} 
} 
3
Hashset<T> 

Должен работать, если вы хотите,

See MSDN

Как уже упоминалось в комментариях, ICollection<T> еще более простой коллекции, которая является неупорядоченным и позволит дублирующиеся записи. MSDN

ICollection<string> unordered = new Collection<string>(); 

Наконец, я не в курсе «простого» родной реализации .NET коллекции, которая имеет .Add()/.Remove() функциональность, не подвергая индекс. Итак, чтобы ответить на ваш вопрос, похоже, что для вашей нишевой функциональности вам придется сворачивать самостоятельно.

+0

'HashSet' - это очень специфическая коллекция и ее Добавить, возможно, не нужно добавлять элементы ... Я бы не использовал его как пример простой реализации ... –

+1

' HashSet 'требует, чтобы каждый элемент был уникальным, а' ICollection 'может содержать дублированные элементы. –

0

Просто чтобы дать быстрые различия:

SortedList

Это лучший способ использовать, чтобы получить ключи от довольно индекса и он основан на двоичном поиске. Внутри он использует два списка: IList и IList. Он не использует словарь. Таким образом, он не имеет значений Хэш.

SortedDictionary такой же, как SortedList. Однако разница заключается в внутреннем развитии. Сортированный словарь использует B Tree. Таким образом, изменения бывают быстрыми, и поиск аналогичен отсортированному списку.

Разница между HashSet и List - это HashSet обеспечивает уникальность. Это означает, что если вы попытаетесь добавить значение дважды, оно проигнорирует это значение без какой-либо ошибки или дублирования.

Так что, если вы не хотите использовать индекс на основе, то вы можете использовать SortedList, унаследованные от ICollection, а затем IEnumerable ...

В противном случае HashSet является лучшим вариантом, где уникальность имеет важное значение.

+0

Не SortedList.GetByIndex() означает, что он по-прежнему основан на индексе и доступен как таковой, хотя предпочтительный метод доступа является ключом? –

+0

@ DavidL согласился, и кроме того, к 'SortedList' можно получить ключ, который мне тоже не нужен. Не говоря уже о сортировке и т. Д. - много дополнительной функциональности, определенно не являющейся кандидатом на простую реализацию «ICollection». –

+0

@ DavidL Да, вы правы. Я только что дал вам четкое понимание различных вариантов. Если вы просто хотите добавить удаление, то, безусловно, вы можете goahead с методами расширения или иначе, новый подкласс, наследующий от ICollection ... – codebased

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