Это зависит от того, что вы подразумеваете под «выставляет оператор []».
Если вы хотите иметь возможность доступа к объектам в уникальной коллекции по некоторому произвольному ключу, тогда используйте Dictionary<string key, object value>
.
Если вы хотите иметь возможность создавать список уникальных объектов, который разрешает доступ по порядковому индексу, в порядке добавления объектов, вам нужно будет свернуть что-то свое.Я не знаю ни одного фреймворкового класса, который бы предлагал уникальность, такую как HashSet<T>
, а также разрешал доступ к объектам в том порядке, в котором они были добавлены, например, List<T>
.SortedSet<T>
почти делает это, но не имеет доступа к индексатору - поэтому, хотя он поддерживает порядок, он не разрешает доступ с использованием этого порядка, кроме как через перечисление.Вы можете использовать метод расширения Linq ElementAt
для доступа к элементу по определенному порядковому индексу, но производительность будет очень плохой, так как этот метод работает итерацией.
Вы также можете использовать Dictionary<int key, object value>
, но у вас все равно будетвести индекс самостоятельно, и если что-нибудь удалится, в вашем списке будет дыра.Это было бы хорошим решением, если бы вам никогда не приходилось удалять элементы.
Чтобы иметь уникальность и доступ по индексу, а также иметь возможность удалять элементы, вам нужна комбинация хэш-таблицы и упорядоченного списка.Я создал такой класс недавно.Я не думаю, что это обязательно самая эффективная реализация, поскольку она выполняет свою работу, сохраняя две копии списков (один как List<T>
и один как HashSet<T>
).
В моей ситуации я оценил скорость по сравнению с эффективностью хранения, поскольку объем данных был невелик.Этот класс предлагает скорость List<T>
для индексированного доступа и скорость HashTable<T>
для доступа к элементу (например, обеспечение уникальности при добавлении) за счет удвоения требований к хранилищу.
Альтернативой будетиспользовать только List<T>
в качестве основы и проверять уникальность перед любой операцией добавления / вставки.Это будет более эффективно использовать память, но намного медленнее для операций добавления / вставки, поскольку в нем не используется хеш-таблица.
Вот класс, который я использовал.
http://snipt.org/xlRl