سؤال

لدي مشروع أقوم به على ذلك يتطلب تغيير فئة "basesortedcollection" للسماح بتكرار. ينفذ الفصل حاليا IEnumperable و ICOollection و Iserializable. تتخزن العناصر "BasesortedCollection" التي تحتوي على عنصر (INT64)، والتي يتم استخدامها كمفتاح عند الوصول إلى المجموعة. أحتاج إلى وجود عنصرين متطابقين (نفس العناصر) الموجودة في المجموعة في نفس الوقت وكذلك أن تكون قادرا على استردادها.

نحن نستخدم إطار 2.0.

أي اقتراحات؟

شكرا مقدما!

هل كانت مفيدة؟

المحلول

أعتقد أنك سيتعين عليك توسيع قائمة بيانات منتظمة، وتجاوز طريقة الوظيفة الإضافية للاتصال بالفرز إذا كنت بحاجة إلى الفرز التلقائي. ومع ذلك، لا يبدو لي أن ألتف رأسي حول فكرة عن عنصرين مع نفسه (ما يجب أن يكون فريدا) رقم التعريف؟!

تحرير، أو ربما namevaluecolection (في system.collections.pecialized) هو أكثر ملاءمة؟ تمديده وإضافة طريقة الفرز الخاصة بك ...

نصائح أخرى

يمكن أن يكون كل عنصر في BasesortedCollection الخاص بك قائمة (ر)، لذلك إذا كان لديك عنصرين بنفس المفتاح، فستكون لديك قائمة (T) تحتوي على عنصرين للإدخال المقابل لهذا المفتاح.

أفترض أنك كنت قد تمدد نوع من القاموس الذي لا يسمح بمفاتيح مضاعفة.

ماذا عن هذا التنفيذ. أفترض أن البند الخاص بك ينفذ مثبتة.

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 + "]");
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top