¿Qué es unlista única <T> en .NET 2
- preferencia genérica;
- único (IComparable/IEquitable) valorado
colección de objetos para .NET 2?
(a laList<T>
, o un equivalente de HashSet<T>
de .NET 3.5, pero sin artículos pedidos)
¿Qué es unlista única <T> en .NET 2
colección de objetos para .NET 2?
(a laList<T>
, o un equivalente de HashSet<T>
de .NET 3.5, pero sin artículos pedidos)
Lamentablemente, la primera buena clase de marco para esto es HashSet, a la que solo tendrá acceso con .Net 3.5.
Si está atascado en versiones anteriores., Las opciones no son tan agradables. El más común es usar un tipo de diccionario donde la clave es el valor que está tratando de almacenar. Puede envolver esto en su propia clase con bastante facilidad.
Si está dispuesto a salir del marco todos juntos, existen colecciones de estructuras de datos para .Net, como NGenerics.
Gracias por esto. Usé System.Collections.Generic.Dictionary para obtener exactamente el efecto que necesitaba. Lo envolví en una try/catch (ArgumentException) –
¿Hay alguna cola única en .Net 4.0, por ejemplo,? si una cola
@MubasharAhmad No, ese no es un requisito común y probablemente nunca se agregará al marco. Siempre puede crear este comportamiento teniendo tanto una cola como un HashSet, y luego actualice ambos en cualquier operación. –
Lo que se necesita es un conjunto, por lo que yo recuerdo no había ninguna aplicación que figura en 2.0. Puede marcar this.
Editar: Si realmente desea implementar su propio, algo como esto haría el trabajo en detrimento del rendimiento de las inserciones: (No he probado la funcionalidad)
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
}
es una pequeña solución "dura" para importar un proyecto "externo" solo para una colección única. Preferiría o escribiría una colección personalizada por mi cuenta o una mejor solución solo usaría un "truco" en las clases de framework existentes. – serhio
@serhio: Creo que escribir tu propia clase de colección es "más difícil" que simplemente hacer referencia a un componente de un tercero que ha demostrado funcionar. Creo que sufres del síndrome "no inventado aquí". :) –
un método que realmente necesito es '.AsReadOnly()' – serhio
Utilizábamos PowerCollections Establecer la clase para eso en .NET 2. Funcionó bastante bien. Había muchas cosas buenas en la biblioteca.
Puede usar la colección HashedSet<T>
que se define en el ensamblaje Iesi.Collections. Este es un proyecto de código abierto, que también utiliza NHibernate.
Consulte http://stackoverflow.com/questions/687034/using-hashset-in-c-2-0-compatible-with-3-5. –
¿Por qué pones "à la' List '" en tu pregunta? No es una lista de elementos única. –
herzmeister
Si eres un h4x0r malvado, simplemente puedes desplegar el único ensamblado System.Core.dll con tu aplicación. No es necesario instalar el marco completo de .NET 3.5. – herzmeister