C # уникальный индекс универсальной коллекции - PullRequest
1 голос
/ 10 июля 2011

Мне нужна коллекция, которая выставляет оператор [], содержит только уникальные объекты и является универсальной.Кто-нибудь может помочь?

Ответы [ 5 ]

2 голосов
/ 10 июля 2011

Словарь (Of TKey, TValue) Класс представляет собой набор ключей и значений.

1 голос
/ 10 июля 2011
0 голосов
/ 10 июля 2011

Если вы хотите сохранить уникальные объекты (например, сущности) при отображении [], вы хотите использовать класс KeyedCollection.

MSDN KeyedCollection

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;

// This class represents a very simple keyed list of OrderItems,
// inheriting most of its behavior from the KeyedCollection and 
// Collection classes. The immediate base class is the constructed
// type KeyedCollection<int, OrderItem>. When you inherit
// from KeyedCollection, the second generic type argument is the 
// type that you want to store in the collection -- in this case
// OrderItem. The first type argument is the type that you want
// to use as a key. Its values must be calculated from OrderItem; 
// in this case it is the int field PartNumber, so SimpleOrder
// inherits KeyedCollection<int, OrderItem>.
//
public class SimpleOrder : KeyedCollection<int, OrderItem>
{
    // The parameterless constructor of the base class creates a 
    // KeyedCollection with an internal dictionary. For this code 
    // example, no other constructors are exposed.
    //
    public SimpleOrder() : base() {}

    // This is the only method that absolutely must be overridden,
    // because without it the KeyedCollection cannot extract the
    // keys from the items. The input parameter type is the 
    // second generic type argument, in this case OrderItem, and 
    // the return value type is the first generic type argument,
    // in this case int.
    //
    protected override int GetKeyForItem(OrderItem item)
    {
        // In this example, the key is the part number.
        return item.PartNumber;
    }
}
0 голосов
/ 10 июля 2011

Это зависит от того, что вы подразумеваете под «выставляет оператор []».

Если вы хотите иметь возможность доступа к объектам в уникальной коллекции по некоторому произвольному ключу, тогда используйте 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

0 голосов
/ 10 июля 2011

Класс HashSet должен сделать свое дело.См. HashSet (Of T) для получения дополнительной информации.Если вам нужно, чтобы они поддерживали отсортированный порядок, SortedSet должен сделать свое дело.См. SortedSet (Of T) для получения дополнительной информации об этом классе.

...