Что такое a
набор объектов для.NET 2?
(а-ля List<T>
, или эквивалент HashSet<T>
от.NET 3.5, но без заказанных объектов)
К сожалению, первым хорошим классом фреймворка для этого является HashSet , доступ к которому вы получите только с .Net 3.5.
Если вы застряли в предыдущих версиях, варианты не так хороши. Чаще всего используется тип Dictionary, в котором ключ - это значение, которое вы пытаетесь сохранить. Вы можете довольно легко обернуть это в свой собственный класс.
Если вы хотите все вместе выйти за пределы фреймворка, существуют коллекции структур данных для .Net, такие как NGenerics .
Что вам нужно, так это 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
}
Вы можете использовать коллекцию HashedSet
, которая определен в сборке Iesi.Collections .
Это проект с открытым исходным кодом, который также используется NHibernate.
Мы использовали для этого класс PowerCollections Set в .NET 2. Он работал довольно хорошо. В библиотеке было много хороших вещей.