2009-04-08 15 views
6

में स्वीकृत डुप्लिकेट की आवश्यकता है मेरे पास एक प्रोजेक्ट है जिस पर मैं काम कर रहा हूं जिसके लिए डुप्लिकेट की अनुमति देने के लिए 'बेससोर्टेड कोलेक्शन' क्लास को बदलने की आवश्यकता है। कक्षा वर्तमान में IENumerable, IDisposable, ICollection, और ISerializable लागू करता है। 'बेसस्ोर्टेड कोलेक्शन' उन आइटम्स को स्टोर करता है जिनमें आइटम आईडी (इंटी 64) है, जिसे संग्रह तक पहुंचने पर कुंजी के रूप में उपयोग किया जाता है। मुझे एक ही समय में संग्रह में दो समान आइटम (एक ही आइटम आईडी) मौजूद होना चाहिए, साथ ही पुनर्प्राप्त करने में सक्षम होना चाहिए।सॉर्ट किए गए कोलेक्शन (सी #, 2.0)

हम 2.0 ढांचे का उपयोग कर रहे हैं।

कोई सुझाव?

अग्रिम धन्यवाद!

+1

काम करना चाहिए मैं यह मुश्किल अपने BaseSortedCollection के कुछ कार्यान्वयन विवरण जानने के बिना अच्छी सलाह देने के लिए लगता है। डुप्लिकेट पहली जगह क्यों काम नहीं कर रहे हैं? क्यों नहीं (शायद संतुलित) बाइनरी पेड़ का उपयोग अपने सामान के लिए डेटा संरचना के रूप में नहीं करते? – Lucero

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। डुप्लिकेट काम नहीं कर रहे हैं क्योंकि दो वस्तुओं में एक ही आइटम आईडी है, जो कि संग्रह में कुंजी के रूप में उपयोग किया जा रहा है। –

उत्तर

-1

मुझे लगता है कि आपको नियमित ऐरेलिस्ट का विस्तार करना होगा, और ऑटो सॉर्टिंग की आवश्यकता होने पर सॉर्ट करने के लिए ऐड-विधि को ओवरराइड करना होगा। हालांकि, मैं अपने सिर को दो वस्तुओं के विचार के आसपास लपेट नहीं सकता (पहचान क्या होना चाहिए) पहचान संख्या ?!

संपादित करें, या शायद NameValueCollection (System.Collections.Specialized में) अधिक उपयुक्त है? इसे बढ़ाएं और अपनी खुद की सॉर्टिंग विधि जोड़ें ...

5

आपके बेसस्टोर्ट कोलेक्शन में प्रत्येक आइटम एक सूची (टी) हो सकता है, इसलिए यदि आपके पास एक ही कुंजी के साथ दो आइटम हैं, तो आपके पास एक सूची (टी) होगी जिसमें दो आइटम होंगे उस कुंजी के अनुरूप प्रविष्टि के लिए।

+0

मैं एक सूची (टी) के बजाय एक संग्रह (टी) रखना पसंद करता हूं क्योंकि एक सूची मेरी सूची [20] = कुछ ऐसा करने की अनुमति देगी जो सॉर्टिंग को नष्ट कर देगी। नीचे मेरा जवाब देखें – k3b

0

मुझे लगता है कि आप एक प्रकार का शब्दकोश विस्तार कर रहे थे जो डुप्लिकेट कुंजी की अनुमति नहीं देता है।

इस कार्यान्वयन के बारे में क्या। मुझे लगता है कि आपकी वस्तु 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; 
    } 
} 

इस (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 + "]"); 
    } 
संबंधित मुद्दे