Alguém sabe se existe um bom equivalente à Set
coleção do Java em c #? Eu sei que você pode imitar um conjunto usando um a Dictionary
ou a HashTable
preenchendo, mas ignorando os valores, mas essa não é uma maneira muito elegante.
fonte
Alguém sabe se existe um bom equivalente à Set
coleção do Java em c #? Eu sei que você pode imitar um conjunto usando um a Dictionary
ou a HashTable
preenchendo, mas ignorando os valores, mas essa não é uma maneira muito elegante.
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.
fonte
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 queSortedSet<T>
éO(log n)
para pesquisar e manipular operações.fonte
Eu uso o Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx
É usado em muitos projetos de OSS, eu o encontrei no NHibernate
fonte
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.fonte
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 .
fonte
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
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.
fonte
List.Contains
é deO(n)
complexidade, o que significa que seuAdd
método agora também se tornaO(n)
complexo. Supondo que a coleção interna não precise ser redimensionada,Add
para ambasList
eHashMap
deve ser deO(1)
complexidade. TLDR: Isso funcionará, mas é hacky e menos eficiente.