2009-04-08 4 views
6

내가 작업하고있는 프로젝트에서 'BaseSortedCollection'클래스를 변경하여 중복을 허용해야합니다. 클래스는 현재 IEnumerable, IDisposable, ICollection 및 ISerializable을 구현합니다. 'BaseSortedCollection'은 컬렉션에 액세스 할 때 키로 사용되는 ItemID (Int64)가있는 항목을 저장합니다. 두 개의 동일한 항목 (동일한 ItemID)을 컬렉션에 동시에 가져와 검색 할 수 있어야합니다.SortedCollection에서 중복 허용 필요 (C#, 2.0)

우리는 2.0 프레임 워크를 사용하고 있습니다.

제안 사항?

미리 감사드립니다.

+1

(MSTEST을 사용하여) 작동합니다. 중복이 처음부터 작동하지 않는 이유는 무엇입니까? 아이템에 대한 데이터 구조로 (아마도 밸런싱 된) 이진 트리를 사용하지 않으시겠습니까? – Lucero

+0

답변 해 주셔서 감사합니다. 두 개의 항목이 동일한 ItemID를 가지고 있기 때문에 복제본이 작동하지 않습니다. 이는 컬렉션의 키로 사용되는 항목입니다. –

답변

-1

자동 배열이 필요할 경우 일반 ArrayList를 확장하고 Add 메서드를 재정 의하여 재정의해야합니다. 그러나, 나는 같은 (어떤 고유해야한다) 식별 번호와 함께 두 가지 항목의 아이디어 주위에 내 머리를 감싸는 것처럼 보일 수 없어?!

편집 또는 System.Collections.Specialized의 NameValueCollection이 더 적절합니까? 그것을 확장하고 자신의 정렬 방법을 추가하십시오 ...

5

당신의 BaseSortedCollection의 각 항목은 List (T)가 될 수 있습니다. 따라서 동일한 키를 가진 두 항목이 있다면 List (T)에 두 항목 해당 키에 해당하는 항목

+0

목록에서 myList [20] = someItem이 정렬을 파괴 할 수 있으므로 List (T) 대신 Collection (T)를 사용하는 것을 선호합니다. 내 대답을 아래에서 참조하십시오. – k3b

0

중복 키를 허용하지 않는 사전을 확장한다고 가정합니다.

이 구현은 어떨까요? 귀하의 Item은 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; 
    } 
} 

이 내가 어려운 당신 BaseSortedCollection의 일부 구현 세부 사항을 알고 있기없이 좋은 조언을 줄 것을 발견

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