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

Что такое a

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

набор объектов для.NET 2?

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

14
задан serhio 14 April 2011 в 10:24
поделиться

4 ответа

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

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

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

8
ответ дан 1 December 2019 в 14:21
поделиться

Что вам нужно, так это 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
}
3
ответ дан 1 December 2019 в 14:21
поделиться

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

2
ответ дан 1 December 2019 в 14:21
поделиться

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

1
ответ дан 1 December 2019 в 14:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: