2009-04-08 3 views
6

私は、 'BaseSortedCollection'クラスを変更して重複を許可する必要があるプロジェクトを持っています。クラスは現在、IEnumerable、IDisposable、ICollection、およびISerializableを実装しています。 'BaseSortedCollection'には、コレクションにアクセスする際にキーとして使用されるItemID(Int64)を持つアイテムが格納されます。私は2つの同一のアイテム(同じItemID)を同時にコレクション内に存在させ、検索することができるようにする必要があります。SortedCollectionで重複が許可されている必要があります(C#、2.0)

2.0フレームワークを使用しています。

提案がありますか?

ありがとうございます!

+1

に(MSTESTを使用して)動作するはずです私はそれは難しいあなたのBaseSortedCollectionのいくつかの実装の詳細を知らなくても良いアドバイスを与えることを見つけます。重複が最初に機能しないのはなぜですか?なぜあなたのアイテムのデータ構造として(おそらくバランスのとれた)バイナリツリーを使用しないのですか? – Lucero

+0

あなたのお返事ありがとうございます。 2つのアイテムが同じItemIDを持っているので、重複は機能しません。これは、コレクションのキーとして使用されているものです。 –

答えて

-1

通常のArrayListを拡張し、自動ソートが必要な場合はAddメソッドをオーバーライドしてSortを呼び出す必要があります。しかし、私は同じ(何が一意でなければなりません)識別番号を持つ2つのアイテムのアイデアの周りに私の頭を包んでいるように見えることができない!

編集、またはおそらくNameValueCollection(System.Collections.Specialized内)が適切ですか?それを拡張し、独自のソート方法を追加してください...

5

あなたのBaseSortedCollectionの各項目はList(T)である可能性があります。同じキーを持つ2つの項目がある場合、2つの項目を含む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; 
    } 
} 

これは

/// <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 + "]"); 
    } 
関連する問題