2009-04-08 12 views
6

Üzerinde çalıştığım bir projemde, kopyalara izin vermek için 'BaseSortedCollection' sınıfının değiştirilmesi gerekiyor. Sınıf şu anda IEnumerable, IDisposable, ICollection ve ISerializable uygular. 'BaseSortedCollection', koleksiyona erişirken anahtar olarak kullanılan ItemID (Int64) içeren öğeleri saklar. Koleksiyonda aynı anda iki özdeş öğeye (aynı ItemID) sahip olmanın yanı sıra alınabilmem gerekir.SortedCollection'da İzin Verilen Kopyalara Gerek Var (C#, 2.0)

2.0 çerçevesini kullanıyoruz.

Herhangi bir öneriniz var mı?

Şimdiden teşekkürler!

+1

(mstest kullanarak) çalışmalıdır. Yinelenen neden ilk etapta çalışmıyor? Neden öğeleriniz için veri yapısı olarak (belki de dengeli) ikili ağacı kullanmıyorsunuz? – Lucero

+0

Cevabınız için teşekkür ederiz. Çoğaltmalar işe yaramaktadır çünkü iki öğe aynı ItemID değerine sahiptir, bu, koleksiyonda anahtar olarak kullanılan şeydir. –

cevap

-1

Normal bir ArrayList öğesini genişletmeniz ve otomatik sıralama işlemine ihtiyacınız varsa Sırala yöntemini çağırmak için Add yöntemini geçersiz kılmanız gerekeceğini tahmin ediyorum. Bununla birlikte, kafamı, aynı olan (benzersiz olması gereken) kimlik numarasıyla iki eşya fikrinin etrafına sarmış görünmüyorum ?!

Düzenleme, veya belki NameValueCollection (System.Collections.Specialized içinde) daha uygun? Genişletin ve kendi sıralama yönteminizi ekleyin ...

5

BaseSortedCollection öğenizdeki her öğe bir Liste (T) olabilir, bu nedenle aynı anahtarla iki öğeniz varsa, iki öğe içeren bir Liste (T) olacaktır. Bu tuşa karşılık gelen giriş için.

+0

Bir liste (T) yerine bir Listeye (T) sahip olmayı tercih ediyorum çünkü bir liste, myList [20] = sıralamayı yok edecek bazı öğelere izin veriyordu. cevabımı aşağıya bakın – k3b

0

Şüpheli anahtarlara izin vermeyen bir tür sözlüğe sahip olduğunuzu varsayalım.

Bu uygulamadan ne haber? Öğenizin IComparable'ı uyguladığını varsayalım.

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

bu Zor senin BaseSortedCollection bazı uygulama ayrıntılarını bilmeden iyi tavsiyelerde bulmak

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