Question

J'ai un projet que je travaille sur ce changement nécessite une classe « BaseSortedCollection » pour permettre les doublons. La classe implémente actuellement IEnumerable, IDisposable, ICollection et ISerializable. Les magasins « BaseSortedCollection » articles qui ont un ItemID (Int64), qui est utilisé comme clé lors de l'accès à la collection. Je dois avoir deux articles identiques (même Itemid) existent dans la collection en même temps, ainsi que de pouvoir récupérer.

Nous utilisons le framework 2.0.

Toutes les suggestions?

Merci d'avance!

Était-ce utile?

La solution

Je suppose que vous devrez étendre une ArrayList régulière, et remplacer la méthode Add à appeler si vous avez besoin Trier le tri automatique. Cependant, je ne peux pas sembler envelopper la tête autour de l'idée de deux points avec le même (ce qui devrait être unique) numéro d'identification?

Modifier, ou peut-être NameValueCollection (en System.Collections.Specialized) est plus approprié? Étendre et ajouter votre propre méthode de tri ...

Autres conseils

Chaque élément de votre BaseSortedCollection pourrait être une liste (T), donc si vous avez deux éléments avec la même clé, vous aurez une liste (T) contenant deux éléments pour l'entrée correspondant à cette touche.

Je suppose que vous étendez une sorte de dictionnaire qui ne permettent pas les clés de douplicate.

Qu'en est-il de cette mise en œuvre. Je suppose que votre article implémente 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;
    }
}

cela devrait fonctionner (en utilisant 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 + "]");
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top