Hashtable Classe
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Representa uma coleção de pares chave/valor que são organizados com base no código hash da chave.
public ref class Hashtable : System::Collections::IDictionary
public ref class Hashtable : ICloneable, System::Collections::IDictionary, System::Runtime::Serialization::IDeserializationCallback, System::Runtime::Serialization::ISerializable
public class Hashtable : System.Collections.IDictionary
[System.Serializable]
public class Hashtable : ICloneable, System.Collections.IDictionary, System.Runtime.Serialization.IDeserializationCallback, System.Runtime.Serialization.ISerializable
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class Hashtable : ICloneable, System.Collections.IDictionary, System.Runtime.Serialization.IDeserializationCallback, System.Runtime.Serialization.ISerializable
public class Hashtable : ICloneable, System.Collections.IDictionary, System.Runtime.Serialization.IDeserializationCallback, System.Runtime.Serialization.ISerializable
type Hashtable = class
interface ICollection
interface IEnumerable
interface IDictionary
[<System.Serializable>]
type Hashtable = class
interface IDictionary
interface ICollection
interface IEnumerable
interface ISerializable
interface IDeserializationCallback
interface ICloneable
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Hashtable = class
interface IDictionary
interface ICollection
interface IEnumerable
interface ISerializable
interface IDeserializationCallback
interface ICloneable
type Hashtable = class
interface ICollection
interface IEnumerable
interface IDictionary
interface ICloneable
interface IDeserializationCallback
interface ISerializable
Public Class Hashtable
Implements IDictionary
Public Class Hashtable
Implements ICloneable, IDeserializationCallback, IDictionary, ISerializable
- Herança
-
Hashtable
- Derivado
- Atributos
- Implementações
Exemplos
O exemplo seguinte mostra como criar, inicializar e executar várias funções para um Hashtable e como imprimir as suas chaves e valores.
using System;
using System.Collections;
class Example
{
public static void Main()
{
// Create a new hash table.
//
Hashtable openWith = new Hashtable();
// Add some elements to the hash table. There are no
// duplicate keys, but some of the values are duplicates.
openWith.Add("txt", "notepad.exe");
openWith.Add("bmp", "paint.exe");
openWith.Add("dib", "paint.exe");
openWith.Add("rtf", "wordpad.exe");
// The Add method throws an exception if the new key is
// already in the hash table.
try
{
openWith.Add("txt", "winword.exe");
}
catch
{
Console.WriteLine("An element with Key = \"txt\" already exists.");
}
// The Item property is the default property, so you
// can omit its name when accessing elements.
Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);
// The default Item property can be used to change the value
// associated with a key.
openWith["rtf"] = "winword.exe";
Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);
// If a key does not exist, setting the default Item property
// for that key adds a new key/value pair.
openWith["doc"] = "winword.exe";
// ContainsKey can be used to test keys before inserting
// them.
if (!openWith.ContainsKey("ht"))
{
openWith.Add("ht", "hypertrm.exe");
Console.WriteLine("Value added for key = \"ht\": {0}", openWith["ht"]);
}
// When you use foreach to enumerate hash table elements,
// the elements are retrieved as KeyValuePair objects.
Console.WriteLine();
foreach( DictionaryEntry de in openWith )
{
Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value);
}
// To get the values alone, use the Values property.
ICollection valueColl = openWith.Values;
// The elements of the ValueCollection are strongly typed
// with the type that was specified for hash table values.
Console.WriteLine();
foreach( string s in valueColl )
{
Console.WriteLine("Value = {0}", s);
}
// To get the keys alone, use the Keys property.
ICollection keyColl = openWith.Keys;
// The elements of the KeyCollection are strongly typed
// with the type that was specified for hash table keys.
Console.WriteLine();
foreach( string s in keyColl )
{
Console.WriteLine("Key = {0}", s);
}
// Use the Remove method to remove a key/value pair.
Console.WriteLine("\nRemove(\"doc\")");
openWith.Remove("doc");
if (!openWith.ContainsKey("doc"))
{
Console.WriteLine("Key \"doc\" is not found.");
}
}
}
/* This code example produces the following output:
An element with Key = "txt" already exists.
For key = "rtf", value = wordpad.exe.
For key = "rtf", value = winword.exe.
Value added for key = "ht": hypertrm.exe
Key = dib, Value = paint.exe
Key = txt, Value = notepad.exe
Key = ht, Value = hypertrm.exe
Key = bmp, Value = paint.exe
Key = rtf, Value = winword.exe
Key = doc, Value = winword.exe
Value = paint.exe
Value = notepad.exe
Value = hypertrm.exe
Value = paint.exe
Value = winword.exe
Value = winword.exe
Key = dib
Key = txt
Key = ht
Key = bmp
Key = rtf
Key = doc
Remove("doc")
Key "doc" is not found.
*/
Imports System.Collections
Module Example
Sub Main()
' Create a new hash table.
'
Dim openWith As New Hashtable()
' Add some elements to the hash table. There are no
' duplicate keys, but some of the values are duplicates.
openWith.Add("txt", "notepad.exe")
openWith.Add("bmp", "paint.exe")
openWith.Add("dib", "paint.exe")
openWith.Add("rtf", "wordpad.exe")
' The Add method throws an exception if the new key is
' already in the hash table.
Try
openWith.Add("txt", "winword.exe")
Catch
Console.WriteLine("An element with Key = ""txt"" already exists.")
End Try
' The Item property is the default property, so you
' can omit its name when accessing elements.
Console.WriteLine("For key = ""rtf"", value = {0}.", _
openWith("rtf"))
' The default Item property can be used to change the value
' associated with a key.
openWith("rtf") = "winword.exe"
Console.WriteLine("For key = ""rtf"", value = {0}.", _
openWith("rtf"))
' If a key does not exist, setting the default Item property
' for that key adds a new key/value pair.
openWith("doc") = "winword.exe"
' ContainsKey can be used to test keys before inserting
' them.
If Not openWith.ContainsKey("ht") Then
openWith.Add("ht", "hypertrm.exe")
Console.WriteLine("Value added for key = ""ht"": {0}", _
openWith("ht"))
End If
' When you use foreach to enumerate hash table elements,
' the elements are retrieved as KeyValuePair objects.
Console.WriteLine()
For Each de As DictionaryEntry In openWith
Console.WriteLine("Key = {0}, Value = {1}", _
de.Key, de.Value)
Next de
' To get the values alone, use the Values property.
Dim valueColl As ICollection = openWith.Values
' The elements of the ValueCollection are strongly typed
' with the type that was specified for hash table values.
Console.WriteLine()
For Each s As String In valueColl
Console.WriteLine("Value = {0}", s)
Next s
' To get the keys alone, use the Keys property.
Dim keyColl As ICollection = openWith.Keys
' The elements of the KeyCollection are strongly typed
' with the type that was specified for hash table keys.
Console.WriteLine()
For Each s As String In keyColl
Console.WriteLine("Key = {0}", s)
Next s
' Use the Remove method to remove a key/value pair.
Console.WriteLine(vbLf + "Remove(""doc"")")
openWith.Remove("doc")
If Not openWith.ContainsKey("doc") Then
Console.WriteLine("Key ""doc"" is not found.")
End If
End Sub
End Module
' This code example produces the following output:
'
'An element with Key = "txt" already exists.
'For key = "rtf", value = wordpad.exe.
'For key = "rtf", value = winword.exe.
'Value added for key = "ht": hypertrm.exe
'
'Key = dib, Value = paint.exe
'Key = txt, Value = notepad.exe
'Key = ht, Value = hypertrm.exe
'Key = bmp, Value = paint.exe
'Key = rtf, Value = winword.exe
'Key = doc, Value = winword.exe
'
'Value = paint.exe
'Value = notepad.exe
'Value = hypertrm.exe
'Value = paint.exe
'Value = winword.exe
'Value = winword.exe
'
'Key = dib
'Key = txt
'Key = ht
'Key = bmp
'Key = rtf
'Key = doc
'
'Remove("doc")
'Key "doc" is not found.
# Create new hash table using PowerShell syntax.
$OpenWith = @{}
# Add one element to the hash table using the Add method.
$OpenWith.Add('txt', 'notepad.exe')
# Add three elements using PowerShell syntax three different ways.
$OpenWith.dib = 'paint.exe'
$KeyBMP = 'bmp'
$OpenWith[$KeyBMP] = 'paint.exe'
$OpenWith += @{'rtf' = 'wordpad.exe'}
# Display hash table.
"There are {0} in the `$OpenWith hash table as follows:" -f $OpenWith.Count
''
# Display hashtable properties.
'Count of items in the hashtable : {0}' -f $OpenWith.Count
'Is hashtable fixed size? : {0}' -f $OpenWith.IsFixedSize
'Is hashtable read-only? : {0}' -f $OpenWith.IsReadonly
'Is hashtable synchronised? : {0}' -f $OpenWith.IsSynchronized
''
'Keys in hashtable:'
$OpenWith.Keys
''
'Values in hashtable:'
$OpenWith.Values
''
<#
This script produces the following output:
There are 4 in the $OpenWith hash table as follows:
Name Value
---- -----
txt notepad.exe
dib paint.exe
bmp paint.exe
rtf wordpad.exe
Count of items in the hashtable : 4
Is hashtable fixed size? : False
Is hashtable read-only? : False
Is hashtable synchronised? : False
Keys in hashtable:
txt
dib
bmp
rtf
Values in hashtable:
notepad.exe
paint.exe
paint.exe
wordpad.exe
#>
Observações
Cada elemento é um par chave/valor armazenado num DictionaryEntry objeto. Uma chave não pode ser null, mas um valor pode ser.
Importante
Não recomendamos que uses a Hashtable disciplina para novos desenvolvimentos. Em vez disso, recomendamos que use a classe genérica Dictionary<TKey,TValue> . Para mais informações, veja Não devem ser usadas coleções não genéricas em GitHub.
Os objetos usados como chaves por a Hashtable são necessários para sobrepor o Object.GetHashCode método (ou a IHashCodeProvider interface) e o Object.Equals método (ou a IComparer interface). A implementação de ambos os métodos e interfaces deve lidar com a sensibilidade a maiúsculas minúsculas da mesma forma; caso contrário, podem Hashtable comportar-se de forma incorreta. Por exemplo, ao criar um Hashtable, deve usar a CaseInsensitiveHashCodeProvider classe (ou qualquer implementação insensível IHashCodeProvider a maiúsculas e minúsculas) com a CaseInsensitiveComparer classe (ou qualquer implementação insensível IComparer a maiúsculas e minúsculas).
Além disso, estes métodos devem produzir os mesmos resultados quando chamados com os mesmos parâmetros enquanto a chave existe no Hashtable. Uma alternativa é usar um Hashtable construtor com um IEqualityComparer parâmetro. Se a igualdade de chave fosse simplesmente igualdade de referência, a implementação herdada de Object.GetHashCode e Object.Equals seria suficiente.
Objetos-chave devem ser imutáveis desde que sejam usados como chaves no Hashtable.
Quando um elemento é adicionado ao Hashtable, o elemento é colocado num balde baseado no código de hash da chave. Pesquisas subsequentes da chave usam o código hash da chave para pesquisar apenas num bucket específico, reduzindo substancialmente o número de comparações de chaves necessárias para encontrar um elemento.
O fator de carga de um Hashtable determina a razão máxima de elementos para baldes. Fatores de carga mais pequenos provocam tempos médios de consulta mais rápidos, à custa de um maior consumo de memória. O fator de carga padrão da versão 1.0 geralmente proporciona o melhor equilíbrio entre velocidade e tamanho. Um fator de carga diferente também pode ser especificado quando o Hashtable é criado.
À medida que elementos são adicionados a Hashtable, o fator de carga real dos Hashtable aumento. Quando o fator de carga real atinge o fator de carga especificado, o número de baldes no Hashtable é automaticamente aumentado para o menor número primo, maior que o dobro do número atual de Hashtable baldes.
Cada objeto-chave em deve Hashtable fornecer a sua própria função de hash, que pode ser acedida chamando GetHash. No entanto, qualquer objeto implementado IHashCodeProvider pode ser passado para um Hashtable construtor, e essa função de hash é usada para todos os objetos da tabela.
A capacidade de a Hashtable é o número de elementos que Hashtable podem dever. À medida que elementos são adicionados a um Hashtable, a capacidade é automaticamente aumentada conforme necessário através da realocação.
.NET Framework apenas: Para objetos muito grandes Hashtable, pode aumentar a capacidade máxima para 2 mil milhões de elementos num sistema de 64 bits definindo o atributo enabled do elemento de configuração <gcAllowVeryLargeObjects> para true no ambiente de execução.
A instrução foreach da linguagem C# (For Each em Visual Basic) devolve um objeto do tipo dos elementos da coleção. Como cada elemento de é Hashtable um par chave/valor, o tipo de elemento não é o tipo da chave nem o tipo do valor. Em vez disso, o tipo de elemento é DictionaryEntry. Por exemplo:
foreach(DictionaryEntry de in myHashtable)
{
// ...
}
For Each de As DictionaryEntry In myHashtable
' ...
Next de
A foreach declaração é um wrapper em torno do enumerador, que só permite ler a partir da coleção, não escrever para.
Como serializar e desserializar um enumerador para um Hashtable pode fazer com que os elementos fiquem reordenados, não é possível continuar a enumeração sem chamar o Reset método.
Note
Como as chaves podem ser herdadas e o seu comportamento alterado, a sua singularidade absoluta não pode ser garantida por comparações usando o Equals método.
Construtores
| Name | Description |
|---|---|
| Hashtable() |
Inicializa uma nova instância vazia da Hashtable classe usando a capacidade inicial predefinida, fator de carga, fornecedor de código de hash e comparador. |
| Hashtable(IDictionary, IEqualityComparer) |
Inicializa uma nova instância da Hashtable classe copiando os elementos do dicionário especificado para um novo Hashtable objeto. O novo Hashtable objeto tem uma capacidade inicial igual ao número de elementos copiados e utiliza o fator de carga padrão e o objeto especificado IEqualityComparer . |
| Hashtable(IDictionary, IHashCodeProvider, IComparer) |
Obsoleto.
Inicializa uma nova instância da Hashtable classe copiando os elementos do dicionário especificado para o novo Hashtable objeto. O novo Hashtable objeto tem uma capacidade inicial igual ao número de elementos copiados e utiliza o fator de carga padrão, bem como o fornecedor e comparador de código hash especificados. Esta API está obsoleta. Para uma alternativa, veja Hashtable(IDictionary, IEqualityComparer). |
| Hashtable(IDictionary, Single, IEqualityComparer) |
Inicializa uma nova instância da Hashtable classe copiando os elementos do dicionário especificado para o novo Hashtable objeto. O novo Hashtable objeto tem uma capacidade inicial igual ao número de elementos copiados e utiliza o fator de carga e IEqualityComparer o objeto especificados. |
| Hashtable(IDictionary, Single, IHashCodeProvider, IComparer) |
Obsoleto.
Inicializa uma nova instância da Hashtable classe copiando os elementos do dicionário especificado para o novo Hashtable objeto. O novo Hashtable objeto tem uma capacidade inicial igual ao número de elementos copiados e utiliza o fator de carga especificado, o fornecedor de código hash e o comparador. |
| Hashtable(IDictionary, Single) |
Inicializa uma nova instância da Hashtable classe copiando os elementos do dicionário especificado para o novo Hashtable objeto. O novo Hashtable objeto tem uma capacidade inicial igual ao número de elementos copiados, e utiliza o fator de carga especificado, bem como o fornecedor e comparador padrão do código de hash. |
| Hashtable(IDictionary) |
Inicializa uma nova instância da Hashtable classe copiando os elementos do dicionário especificado para o novo Hashtable objeto. O novo Hashtable objeto tem uma capacidade inicial igual ao número de elementos copiados e utiliza o fator de carga predefinido, o fornecedor de código hash e o comparador. |
| Hashtable(IEqualityComparer) |
Inicializa uma nova instância vazia da Hashtable classe usando a capacidade inicial e o fator de carga predefinidos, bem como o objeto especificado IEqualityComparer . |
| Hashtable(IHashCodeProvider, IComparer) |
Obsoleto.
Inicializa uma nova instância vazia da Hashtable classe usando a capacidade inicial e o fator de carga predefinidos, bem como o fornecedor e comparador de código hash especificados. |
| Hashtable(Int32, IEqualityComparer) |
Inicializa uma nova instância vazia da Hashtable classe usando a capacidade inicial especificada e IEqualityComparer, e o fator de carga padrão. |
| Hashtable(Int32, IHashCodeProvider, IComparer) |
Obsoleto.
Inicializa uma nova instância vazia da Hashtable classe usando a capacidade inicial especificada, o fornecedor de código hash, o comparador e o fator de carga padrão. |
| Hashtable(Int32, Single, IEqualityComparer) |
Inicializa uma nova instância vazia da Hashtable classe usando a capacidade inicial, o fator de carga e IEqualityComparer o objeto especificados. |
| Hashtable(Int32, Single, IHashCodeProvider, IComparer) |
Obsoleto.
Inicializa uma nova instância vazia da Hashtable classe usando a capacidade inicial especificada, fator de carga, fornecedor de código hash e comparador. |
| Hashtable(Int32, Single) |
Inicializa uma nova instância vazia da Hashtable classe usando a capacidade inicial e o fator de carga especificados, bem como o fornecedor e comparador padrão de código hash. |
| Hashtable(Int32) |
Inicializa uma nova instância vazia da Hashtable classe usando a capacidade inicial especificada, e o fator de carga predefinido, fornecedor de código hash e comparador. |
| Hashtable(SerializationInfo, StreamingContext) |
Inicializa uma nova instância vazia da Hashtable classe que é serializável usando os objetos e StreamingContext especificadosSerializationInfo. |
Propriedades
| Name | Description |
|---|---|
| comparer |
Obsoleto.
|
| Count |
Obtém o número de pares chave/valor contidos no Hashtable. |
| EqualityComparer |
Obtém o IEqualityComparer para usar para o Hashtable. |
| hcp |
Obsoleto.
Obtém ou define o objeto que pode dispensar códigos de hash. |
| IsFixedSize |
Obtém um valor que indica se o Hashtable tem um tamanho fixo. |
| IsReadOnly |
Recebe um valor que indica se o Hashtable é apenas de leitura. |
| IsSynchronized |
Recebe um valor que indica se o acesso ao Hashtable é sincronizado (thread safe). |
| Item[Object] |
Obtém ou define o valor associado à chave especificada. |
| Keys |
Obtém um ICollection contendo as chaves no Hashtable. |
| SyncRoot |
Obtém um objeto que pode ser usado para sincronizar o acesso ao Hashtable. |
| Values |
Obtém um ICollection contendo os valores em .Hashtable |
Métodos
| Name | Description |
|---|---|
| Add(Object, Object) |
Adiciona um elemento com a chave e valor especificados no Hashtable. |
| Clear() |
Remove todos os elementos do Hashtable. |
| Clone() |
Cria uma cópia superficial do Hashtable. |
| Contains(Object) |
Determina se o Hashtable contém uma chave específica. |
| ContainsKey(Object) |
Determina se o Hashtable contém uma chave específica. |
| ContainsValue(Object) |
Determina se o Hashtable contém um valor específico. |
| CopyTo(Array, Int32) |
Copia os Hashtable elementos para uma instância unidimensional Array no índice especificado. |
| Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object) |
| GetEnumerator() |
Retorna um IDictionaryEnumerator que itera através do Hashtable. |
| GetHash(Object) |
Devolve o código de hash da chave especificada. |
| GetHashCode() |
Serve como função de hash predefinida. (Herdado de Object) |
| GetObjectData(SerializationInfo, StreamingContext) |
Implementa a ISerializable interface e devolve os dados necessários para serializar o Hashtable. |
| GetType() |
Obtém o Type da instância atual. (Herdado de Object) |
| KeyEquals(Object, Object) |
Compara uma chave específica Object com uma chave específica no Hashtable. |
| MemberwiseClone() |
Cria uma cópia superficial do atual Object. (Herdado de Object) |
| OnDeserialization(Object) |
Implementa a ISerializable interface e levanta o evento de desserialização quando a desserialização está concluída. |
| Remove(Object) |
Remove o elemento com a chave especificada da Hashtable. |
| Synchronized(Hashtable) |
Devolve um wrapper sincronizado (thread-safe) para o Hashtable. |
| ToString() |
Devolve uma cadeia que representa o objeto atual. (Herdado de Object) |
Implementações de Interface Explícita
| Name | Description |
|---|---|
| IEnumerable.GetEnumerator() |
Devolve um enumerador que itera numa coleção. |
Métodos da Extensão
| Name | Description |
|---|---|
| AsParallel(IEnumerable) |
Permite a paralelização de uma consulta. |
| AsQueryable(IEnumerable) |
Converte um IEnumerable para um IQueryable. |
| Cast<TResult>(IEnumerable) |
Conjura os elementos de an IEnumerable para o tipo especificado. |
| OfType<TResult>(IEnumerable) |
Filtra os elementos de um IEnumerable com base num tipo especificado. |
Aplica-se a
Segurança de Thread
Hashtable É seguro para uso de múltiplos fios leitores e um único fio de escrita. É seguro para threads para uso multi-thread quando apenas uma das threads realiza operações de escrita (atualização), o que permite leituras sem bloqueios, desde que os escritores sejam serializados para o Hashtable. Para suportar múltiplos escritores, todas as operações sobre o Hashtable devem ser feitas através do wrapper devolvido pelo Synchronized(Hashtable) método, desde que não haja threads a ler o Hashtable objeto.
Enumerar através de uma coleção não é intrinsecamente um procedimento seguro para threads. Mesmo quando uma coleção está sincronizada, outros threads ainda podem modificar a coleção, o que faz com que o enumerador lance uma exceção. Para garantir a segurança dos threads durante a enumeração, pode bloquear a coleção durante toda a enumeração ou apanhar as exceções resultantes de alterações feitas por outros threads.