Domanda

Ho un progetto che sto lavorando su questo richiede la modifica di una classe 'BaseSortedCollection' per consentire i duplicati. La classe attualmente implementa IEnumerable, IDisposable, ICollection e ISerializable. Il 'BaseSortedCollection' memorizza Gli elementi che hanno un ItemID (Int64), che viene utilizzato come chiave per l'accesso alla raccolta. Ho bisogno di avere due articoli identici (stesso ItemID) esiste nell'insieme allo stesso tempo così come essere in grado di essere ritirato.

Stiamo usando il framework 2.0.

Qualche suggerimento?

Grazie in anticipo!

È stato utile?

Soluzione

Credo che si dovrà estendere un ArrayList regolare, e ignorare l'Add-metodo da chiamare Sort se è necessario l'ordinamento automatico. Tuttavia, non riesco a avvolgere la mia testa intorno all'idea di due elementi con lo stesso (quello che dovrebbe essere unico) numero di identificazione?!

Modifica, o forse NameValueCollection (in System.Collections.Specialized) è più appropriato? Estendere e aggiungere il proprio metodo di ordinamento ...

Altri suggerimenti

Ogni elemento nella tua BaseSortedCollection potrebbe essere un List (T), quindi se avete due elementi con la stessa chiave, si avrà un elenco (T) contenente due articoli per la voce corrispondente a quella chiave.

Suppongo che si stava estendendo una sorta di dizionario che non consentono le chiavi douplicate.

Che dire di questa implementazione. Presumo che il tuo articolo 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;
    }
}

questo dovrebbe funzionare (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 + "]");
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top