Alguém sabe se existe um bom equivalente à Setcoleção do Java em c #? Eu sei que você pode imitar um conjunto usando um a Dictionaryou a HashTablepreenchendo, mas ignorando os valores, mas essa não é uma maneira muito elegante.
Alguém sabe se existe um bom equivalente à Setcoleção do Java em c #? Eu sei que você pode imitar um conjunto usando um a Dictionaryou a HashTablepreenchendo, mas ignorando os valores, mas essa não é uma maneira muito elegante.
Respostas:
Experimente o HashSet :
A classe HashSet (Of T) fornece operações de conjunto de alto desempenho. Um conjunto é uma coleção que não contém elementos duplicados e cujos elementos não estão em nenhuma ordem específica ...
A capacidade de um objeto HashSet (Of T) é o número de elementos que o objeto pode conter. A capacidade de um objeto HashSet (Of T) aumenta automaticamente conforme os elementos são adicionados ao objeto.
A classe HashSet (Of T) é baseada no modelo de conjuntos matemáticos e fornece operações de conjunto de alto desempenho semelhantes ao acesso às chaves das coleções Dictionary (Of TKey, TValue) ou Hashtable . Em termos simples, a classe HashSet (Of T) pode ser considerada uma coleção Dictionary (Of TKey, TValue) sem valores.
Uma coleção HashSet (Of T) não é classificada e não pode conter elementos duplicados ...
Se você estiver usando o .NET 3.5, poderá usar HashSet<T>. É verdade que o .NET não atende a conjuntos tão bem quanto o Java.
O Wintellect PowerCollections também pode ajudar.
Se você estiver usando o .NET 4.0 ou posterior:
No caso em que você precisa classificar, use SortedSet<T>. Caso contrário, se não o fizer, use-o, HashSet<T>pois é O(1)para operações de pesquisa e manipulação. Considerando que SortedSet<T>é O(log n)para pesquisar e manipular operações.
Eu uso o Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx
É usado em muitos projetos de OSS, eu o encontrei no NHibernate
Eu uso um wrapper em torno de um Dictionary<T, object>, armazenando nulos nos valores. Isso permite que O (1) adicione, procure e remova as chaves e, para todos os efeitos, atua como um conjunto.
Dê uma olhada no PowerCollections no CodePlex. Além de Set e OrderedSet, existem alguns outros tipos de coleções úteis, como Deque, MultiDictionary, Bag, OrderedBag, OrderedDictionary e OrderedMultiDictionary.
Para mais coleções, há também a Biblioteca de coleções genéricas do C5 .
Eu sei que esse é um thread antigo, mas estava com o mesmo problema e achei o HashSet muito confiável porque, dada a mesma semente, GetHashCode () retornou códigos diferentes. Então, pensei, por que não usar uma lista e ocultar o método add como este
public class UniqueList<T> : List<T>
{
public new void Add(T obj)
{
if(!Contains(obj))
{
base.Add(obj);
}
}
}
Como a List usa o método Equals apenas para determinar a igualdade, é possível definir o método Equals no seu tipo T para garantir que você obtenha os resultados desejados.
List.Containsé de O(n)complexidade, o que significa que seu Addmétodo agora também se torna O(n)complexo. Supondo que a coleção interna não precise ser redimensionada, Addpara ambas Liste HashMapdeve ser de O(1)complexidade. TLDR: Isso funcionará, mas é hacky e menos eficiente.