Уникальный список <T>в .NET 2 - PullRequest
       51

Уникальный список <T>в .NET 2

14 голосов
/ 04 февраля 2010

Что такое

  • предпочтительно универсальный;
  • уникальный (IComparable / IEquitable) оцененный

коллекция объектов для .NET 2 ?

( а-ля List<T> или эквивалент HashSet<T> из .NET 3.5, но без заказанных товаров)

Ответы [ 4 ]

8 голосов
/ 04 февраля 2010

К сожалению, первый хороший класс фреймворка для этого - HashSet , доступ к которому вы получите только с .Net 3.5.

Если вы застряли в предыдущих версиях., Варианты не так хороши. Наиболее распространенным является использование типа Dictionary, где Key - это значение, которое вы пытаетесь сохранить. Вы можете легко обернуть это в своем классе.

Если вы все вместе хотите выйти за рамки, существуют коллекции структур данных для .Net, такие как NGenerics .

3 голосов
/ 04 февраля 2010

Что вам нужно, так это Set, насколько я помню, в 2.0 не было реализации Set. Вы можете проверить это .

Изменить: Если вы действительно хотите реализовать свой собственный, что-то вроде этого сделало бы работу за счет производительности на вставках: (я не тестировал функциональность)

class UniqueList<T> : IList<T>
{
    private IList<T> m_InternalList;

    public UniqueList(IList<T> list)
    {
        m_InternalList = list;
    }

    public System.Collections.ObjectModel.ReadOnlyCollection<T> AsReadOnly()
    {
        return new System.Collections.ObjectModel.ReadOnlyCollection<T>(this);
    }

    #region IList<T> Members

    public int IndexOf(T item)
    {
        return m_InternalList.IndexOf(item);
    }

    public void Insert(int index, T item)
    {
        if (!m_InternalList.Contains(item))
            m_InternalList.Insert(index, item);
    }

    public void RemoveAt(int index)
    {
        m_InternalList.RemoveAt(index);
    }

    public T this[int index]
    {
        get
        {
            return m_InternalList[index];
        }
        set
        {
            if (!m_InternalList.Contains(value))
                m_InternalList[index] = value;
        }
    }

    #endregion

    #region ICollection<T> Members

    public void Add(T item)
    {
        if (!m_InternalList.Contains(item))
            m_InternalList.Add(item);
    }

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

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

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

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

    public bool IsReadOnly
    {
        get { return m_InternalList.IsReadOnly; }
    }

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

    #endregion

    #region IEnumerable<T> Members

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

    #endregion

    #region IEnumerable Members

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

    #endregion
}
2 голосов
/ 04 февраля 2010

Можно использовать коллекцию HashedSet<T>, определенную в сборке Iesi.Collections . Это проект с открытым исходным кодом, который также используется NHibernate.

1 голос
/ 04 февраля 2010

Мы привыкли использовать PowerCollections Установить класс для этого в .NET 2. Он работал довольно хорошо. В библиотеке было много приятных вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...