Pregunta

Tengo un proyecto que estoy trabajando en que requiere el cambio de una clase 'BaseSortedCollection' para permitir duplicados. La clase actualmente implementa IEnumerable, IDisposable, ICollection y ISerializable. El 'BaseSortedCollection' almacena los elementos que tienen un ItemID (Int64), que se utiliza como la clave cuando se accede a la colección. Es necesario disponer de dos elementos idénticos (mismo ItemID) existir en la colección, al mismo tiempo, así como ser capaz de ser recuperada.

Estamos utilizando el marco 2.0.

¿Alguna sugerencia?

Gracias de antemano!

¿Fue útil?

Solución

supongo que tendrá que extender un ArrayList regular, y anular el complemento método a llamar si necesita ordenar la clasificación automática. Sin embargo, me parece que no puede envolver mi cabeza alrededor de la idea de dos elementos con el mismo (lo que debe ser único) número de identificación?!

Editar, o tal vez NameValueCollection (en System.Collections.Specialized) es más apropiado? Extenderlo y añadir su propio método de clasificación ...

Otros consejos

Cada elemento de la BaseSortedCollection podría ser una lista (T), por lo que si usted tiene dos elementos, con la misma clave, que tendrá una lista (T) que contiene dos artículos para la entrada correspondiente a esa tecla.

Asumo que estaban extendiendo una especie de diccionario que no permiten teclas douplicate.

¿Qué pasa con esta implementación. Asumo que su artículo implementa IComparable.

class BaseSortedCollection<T> : Collection<T>, ICollection<T>, IEnumerable<T>,
    System.Collections.ICollection, System.Collections.IEnumerable
    where T : IComparable<T>
{
    /// <summary>
    ///     Adds an item to the Collection<T> at the correct position.
    /// </summary>
    /// <param name="item">The object to add to </param>
    public new void Add(T item)
    {
        int pos = GetInsertPositio(item);
        base.InsertItem(pos, item);
    }


    /// <summary>
    /// Convinience function to add variable number of items in one Functioncall
    /// </summary>
    /// <param name="itemsToBeAdded">The items to be added.</param>
    /// <returns>this to allow fluent interface</returns>
    public AutoSortCollection<T> AddItems(params T[] itemsToBeAdded)
    {
        foreach (var item in itemsToBeAdded)
            Add(item);
        return this;
    }

    /// <summary>
    /// Get position where item should be inserted.
    /// </summary>
    /// <param name="item"></param>
    /// <returns>Get position where item should be inserted.</returns>
    private int GetInsertPositio(T item)
    {
        if (item == null)
            throw new ArgumentNullException();

        for (int pos = this.Count - 1; pos >= 0; pos--)
        {
            if (item.CompareTo(this.Items[pos]) > 0)
                return pos + 1;
        }

        return 0;
    }
}

esto debería funcionar (usando MSTEST)

    /// <summary>
    ///A test sorting for SCCPackageEx Constructor
    ///</summary>
    [TestMethod()]
    public void SortingTest()
    {
        BaseSortedCollection<int> collection = new BaseSortedCollection<int>().AddItems(1,5,3,2,4,0);
        Assert.AreEqual(6, collection.Count, "collection.Count");

        for(int i=0; i <=5; i++)
           Assert.AreEqual(i, collection[i], "collection[" + i + "]");
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top