Нужны дубликаты, разрешенные в SortedCollection (C #, 2.0) - PullRequest
6 голосов
/ 08 апреля 2009

У меня есть проект, над которым я работаю, который требует изменения класса BaseSortedCollection, чтобы разрешить дублирование. В настоящее время класс реализует IEnumerable, IDisposable, ICollection и ISerializable. BaseSortedCollection хранит Предметы, имеющие ItemID (Int64), который используется в качестве ключа при доступе к коллекции. Мне нужно, чтобы в коллекции одновременно было два идентичных элемента (один и тот же ItemID), а также возможность их извлечения.

Мы используем фреймворк 2.0.

Есть предложения?

Заранее спасибо!

Ответы [ 3 ]

5 голосов
/ 08 апреля 2009

Каждый элемент в вашей BaseSortedCollection может быть списком (T), поэтому, если у вас есть два элемента с одинаковым ключом, у вас будет список (T), содержащий два элемента для записи, соответствующей этому ключу.

0 голосов
/ 09 декабря 2010

Я предполагаю, что вы расширяете своего рода словарь, который не позволяет дублировать ключи.

Как насчет этой реализации. Я предполагаю, что ваш Предмет реализует 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 + "]");
    }
0 голосов
/ 08 апреля 2009

Полагаю, вам придется расширить обычный ArrayList и переопределить метод Add для вызова Sort, если вам нужна автоматическая сортировка. Тем не менее, я не могу обернуться идеей о двух предметах с одинаковым (что должно быть уникальным) идентификационным номером?!

Редактировать, или, может быть, NameValueCollection (в System.Collections.Specialized) более уместен? Расширьте его и добавьте свой собственный метод сортировки ...

...