2009-04-08 12 views
6

Tôi có một dự án mà tôi đang làm việc trên đó đòi hỏi phải thay đổi một lớp 'BaseSortedCollection' để cho phép trùng lặp. Lớp hiện đang triển khai IEnumerable, IDisposable, ICollection và ISerializable. 'BaseSortedCollection' lưu các mục có ItemID (Int64), được sử dụng làm khóa khi truy cập bộ sưu tập. Tôi cần phải có hai mặt hàng giống nhau (cùng một ItemID) tồn tại trong bộ sưu tập cùng một lúc cũng như có thể được lấy ra.Cần bản sao được phép Trong SortedCollection (C#, 2.0)

Chúng tôi đang sử dụng khung 2.0.

Mọi đề xuất?

Cảm ơn trước!

+1

tôi cảm thấy khó khăn để đưa ra lời khuyên tốt mà không biết một số chi tiết thi hành BaseSortedCollection của bạn. Tại sao các bản sao không hoạt động ở vị trí đầu tiên? Tại sao không sử dụng cây nhị phân (có thể cân bằng) làm cấu trúc dữ liệu cho các mục của bạn? – Lucero

+0

Cảm ơn bạn đã trả lời. Các bản sao không hoạt động vì hai mục có cùng ItemID, đó là những gì đang được sử dụng làm khóa trong bộ sưu tập. –

Trả lời

-1

Tôi đoán bạn sẽ phải mở rộng một ArrayList thông thường và ghi đè lên phương thức Thêm để gọi Sắp xếp nếu bạn cần phân loại tự động. Tuy nhiên, tôi dường như không thể quấn đầu quanh ý tưởng của hai mục với cùng một số (số duy nhất là gì)?

Chỉnh sửa hoặc có thể NameValueCollection (trong System.Collections.Specialized) là phù hợp hơn? Mở rộng nó và thêm phương pháp sắp xếp của riêng bạn ...

5

Mỗi mục trong BaseSortedCollection của bạn có thể là Danh sách (T), vì vậy nếu bạn có hai mục có cùng khóa, bạn sẽ có một Danh sách (T) có chứa hai mục cho mục nhập tương ứng với khóa đó.

+0

tôi thích có một Bộ sưu tập (T) thay vì một Danh sách (T) vì một danh sách sẽ cho phép myList [20] = someItem sẽ hủy phân loại. xem trả lời của tôi dưới đây – k3b

0

Tôi giả sử rằng bạn đang mở rộng một loại từ điển không cho phép khóa douplicate.

Điều gì về việc triển khai này. Tôi giả sử rằng mục của bạn thực hiện 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; 
    } 
} 

này nên làm việc (sử dụng 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 + "]"); 
    } 
Các vấn đề liên quan