Duplicados necessidade permitido em SortedCollection (C #, 2.0)
-
06-09-2019 - |
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!
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 + "]");
}