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.
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.
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 Add
método agora também se torna O(n)
complexo. Supondo que a coleção interna não precise ser redimensionada, Add
para ambas List
e HashMap
deve ser de O(1)
complexidade. TLDR: Isso funcionará, mas é hacky e menos eficiente.