2009-04-08 5 views
6

Ich habe ein Projekt, an dem ich arbeite, das erfordert, eine 'BaseSortedCollection' Klasse zu ändern, um Duplikate zuzulassen. Die Klasse implementiert derzeit IEnumerable, IDisposable, ICollection und ISerializable. Die 'BaseSortedCollection' speichert Elemente mit einer ItemID (Int64), die beim Zugriff auf die Sammlung als Schlüssel verwendet wird. Ich muss zwei identische Elemente (selbe ItemID) zur gleichen Zeit in der Sammlung vorhanden haben und auch abgerufen werden können.Ich brauche Duplikate in SortedCollection (C#, 2.0)

Wir verwenden das 2.0-Framework.

Irgendwelche Vorschläge?

Vielen Dank im Voraus!

+1

ich es gute Ratschläge zu geben, ohne einige Details der Implementierung Ihrer BaseSortedCollection zu wissen, schwierig zu finden. Warum funktionieren Duplikate überhaupt nicht? Warum nicht einen (vielleicht ausgeglichenen) Binärbaum als Datenstruktur für Ihre Artikel verwenden? – Lucero

+0

Danke für Ihre Antwort. Die Duplikate arent funktioniert nicht, da zwei Elemente die gleiche ItemID haben, die als Schlüssel in der Sammlung verwendet wird. –

Antwort

-1

Ich denke, Sie müssen eine regelmäßige ArrayList erweitern und überschreiben die Add-Methode, um Sort aufrufen, wenn Sie die automatische Sortierung benötigen. Jedoch kann ich nicht den Kopf um die Idee von zwei Gegenständen mit der 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 hinzu ...

5

Jedes Element in Ihrer BaseSortedCollection könnte eine Liste (T) sein. Wenn Sie also zwei Elemente mit demselben Schlüssel haben, haben Sie eine Liste (T) mit zwei Elementen für den Eintrag, der diesem Schlüssel entspricht.

+0

Ich bevorzuge eine Collection (T) anstelle einer Liste (T), weil eine Liste myList [20] = someItem erlauben würde, die die Sortierung zerstören würde. siehe meine Antwort unten – k3b

0

Ich nehme an, dass Sie eine Art Wörterbuch erweitert haben, das keine Doppelschlüssel zulässt.

Was ist mit dieser Implementierung. Ich nehme an, dass Ihr Artikel IComparable implementiert.

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; 
    } 
} 

sollte (mit MSTest) arbeiten

/// <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 + "]"); 
    }