Frage

Ich habe ein Projekt, das ich an, dass die Arbeit erfordert einen ‚BaseSortedCollection‘ Klassenwechsel Duplikate zu ermöglichen. Die Klasse zur Zeit implementiert IEnumerable, IDisposable, ICollection und ISerializable. Die ‚BaseSortedCollection‘ Elemente gespeichert, die eine ItemID (Int64) aufweisen, die als Schlüssel verwendet wird, wenn die Sammlung zugreifen. Ich brauche zwei identische Elemente hat (gleiche ItemID) sind in der Sammlung zur gleichen Zeit wie auch in der Lage abgerufen werden.

Wir sind mit dem 2.0-Framework.

Irgendwelche Vorschläge?

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Ich denke, man wird einen regelmäßigen Arraylist zu verlängern haben, und überschreiben Sie die Add-Methode Sort aufrufen, wenn Sie die automatische Sortierung benötigen. Allerdings kann ich nicht meinen Kopf zu wickeln scheinen um die Idee der zwei Elemente mit dem gleichen (was sollte eindeutig sein) Identifikationsnummer?!

Bearbeiten oder vielleicht Namevaluecollection (in System.Collections.Specialized) ist besser geeignet? Erweitern Sie es und fügen Sie Ihre eigene Sortiermethode ...

Andere Tipps

Jedes Element in Ihrem BaseSortedCollection könnte eine List (T), wenn Sie also zwei Elemente mit dem gleichen Schlüssel haben, haben Sie eine Liste (T) enthält zwei Elemente für den Eintrag zu diesem Schlüssel entspricht.

Ich gehe davon aus, dass Sie eine Art Wörterbuch ausdehnten, die douplicate Schlüssel nicht zulassen.

Was ist mit dieser Implementierung. Ich gehe davon aus, dass Ihre Artikel implementiert 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;
    }
}

Das sollte funktionieren (mit 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 + "]");
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top