Pergunta

Eu tenho um projeto que eu estou trabalhando em que exige a mudança de classe um 'BaseSortedCollection' para permitir duplicatas. A classe implementa atualmente IEnumerable, IDisposable, ICollection, e ISerializable. As lojas 'BaseSortedCollection' Itens que têm um ItemID (Int64), que é usado como a chave ao acessar a coleção. Eu preciso ter dois itens idênticos (mesma ItemID) existe na coleção, ao mesmo tempo, bem como ser capaz de ser recuperado.

Estamos usando o framework 2.0.

Todas as sugestões?

Agradecemos antecipadamente!

Foi útil?

Solução

Eu acho que você vai ter que estender um ArrayList regular, e substituir o método Add para chamar Ordenar se você precisa do auto de classificação. No entanto, eu não consigo envolver minha cabeça em torno da idéia de dois itens com o mesmo (o que deve ser único) número de identificação?!

Editar, ou talvez NameValueCollection (em System.Collections.Specialized) é mais apropriado? Estendê-lo e adicione seu próprio método de classificação ...

Outras dicas

Cada item em sua BaseSortedCollection poderia ser um List (T), então se você tem dois itens com a mesma chave, você terá uma List (T) que contém dois itens para a entrada correspondente a essa chave.

Eu assumo que você estava estendendo-se uma espécie de dicionário que não permitem chaves douplicate.

E sobre esta implementação. Presumo que seus implementos 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;
    }
}

isso deve funcionar (usando 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 + "]");
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top