Уникальный список <T> в .NET 2
Что такое
- предпочтительно общий;
- уникальный (IComparable/IEquitable) оцененный
коллекция объектов для .NET 2?
(à la List<T>
или эквивалент HashSet<T>
из .NET 3.5, но без упорядоченных элементов)
Ответы
Ответ 1
К сожалению, первый хороший класс framework для этого - HashSet, с которым вы получите доступ только с помощью .Net 3.5.
Если вы застряли в предыдущих версиях, параметры не так хороши. Наиболее распространенным является использование типа словаря, где ключ - это значение, которое вы пытаетесь сохранить. Вы можете легко обернуть это в свой собственный класс.
Если вы готовы выйти за рамки всей системы, есть коллекции структур данных для .Net, например NGenerics.
Ответ 2
Что вам нужно, так это 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
Вы можете использовать коллекцию HashedSet<T>
, определенную в сборке Iesi.Collections.
Это проект с открытым исходным кодом, который также используется NHibernate.
Ответ 4
Раньше мы использовали PowerCollections Устанавливаем класс для .NET 2. Он работал достаточно хорошо. В библиотеке было много приятного материала.