Hashtable Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет коллекцию пар «ключ-значение», которые упорядочены по хэш-коду ключа.
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
public class Hashtable : ICloneable, System.Collections.IDictionary, System.Runtime.Serialization.IDeserializationCallback, System.Runtime.Serialization.ISerializable
[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
type Hashtable = class
interface ICollection
interface IEnumerable
interface IDictionary
type Hashtable = class
interface ICollection
interface IEnumerable
interface IDictionary
interface ICloneable
interface IDeserializationCallback
interface ISerializable
type Hashtable = class
interface ICollection
interface IEnumerable
interface IDictionary
interface ISerializable
interface IDeserializationCallback
interface ICloneable
[<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
Public Class Hashtable
Implements IDictionary
Public Class Hashtable
Implements ICloneable, IDeserializationCallback, IDictionary, ISerializable
- Наследование
-
Hashtable
- Производный
- Атрибуты
- Реализации
Примеры
В следующем примере показано, как создавать, инициализировать и выполнять различные функции в и Hashtable как распечатать ключи и значения.
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
#>
Комментарии
Каждый элемент представляет собой пару "ключ-значение", хранящуюся в объекте DictionaryEntry . Ключ не может быть null, но значение может быть.
Important
Мы не рекомендуем использовать Hashtable класс для новой разработки. Вместо этого рекомендуется использовать универсальный Dictionary<TKey,TValue> класс. Дополнительные сведения см. в статье, не относящийся к универсальным коллекциям, которые не должны использоваться на сайте GitHub.
Объекты, используемые в качестве ключей, Hashtable необходимы для переопределения Object.GetHashCode метода (или IHashCodeProvider интерфейса) и Object.Equals метода (или IComparer интерфейса). Реализация обоих методов и интерфейсов должна обрабатывать чувствительность регистра одинаково; Hashtable в противном случае поведение может быть неправильно. Например, при создании Hashtableкласса необходимо использовать CaseInsensitiveHashCodeProvider класс (или любую реализацию без учета регистра) с IHashCodeProvider классом (или любой реализацией без учета регистра CaseInsensitiveComparerIComparer).
Кроме того, эти методы должны создавать те же результаты при вызове с теми же параметрами, в то время как ключ существует в .Hashtable Альтернативой Hashtable является использование конструктора с параметром IEqualityComparer . Если бы ключевое равенство было просто эталонным равенством, наследуемая Object.GetHashCode реализация и Object.Equals была бы достаточной.
Ключевые объекты должны быть неизменяемыми, если они используются в качестве ключей в объекте Hashtable.
При добавлении Hashtableэлемента в контейнер, основанный на хэш-коде ключа, элемент помещается в контейнер. Последующие подстановки ключа используют хэш-код ключа для поиска только в одном конкретном контейнере, что значительно снижает количество сравнений ключей, необходимых для поиска элемента.
Коэффициент нагрузки определяет Hashtable максимальное соотношение элементов к контейнерам. Более мелкие факторы нагрузки приводят к более быстрому среднему времени подстановки за счет увеличения потребления памяти. Коэффициент нагрузки по умолчанию 1.0 обычно обеспечивает оптимальный баланс между скоростью и размером. Другой фактор нагрузки также можно указать при Hashtable создании.
Как элементы добавляются в Hashtable, фактический коэффициент Hashtable нагрузки увеличения. Когда фактический коэффициент нагрузки достигает указанного коэффициента нагрузки, число контейнеров в контейнере Hashtable автоматически увеличивается до наименьшего простого числа, которое больше, чем в два раза больше текущего Hashtable числа контейнеров.
Каждый ключевой объект в объекте Hashtable должен предоставлять собственную хэш-функцию, доступ к которой можно получить путем вызова GetHash. Однако любой объект, реализующий IHashCodeProvider объект, можно передать конструктору Hashtable , и эта хэш-функция используется для всех объектов в таблице.
Емкость Hashtable — это количество элементов, которые Hashtable могут храниться. Так как элементы добавляются в объект Hashtable, емкость автоматически увеличивается по мере необходимости при перемещении.
Только .NET Framework: Для очень крупных Hashtable объектов можно увеличить максимальную емкость до 2 миллиардов элементов в 64-разрядной системе, задав enabled атрибут <gcAllowVeryLargeObjects> элемента true конфигурации в среде выполнения.
Оператор foreach языка C# (For Each в Visual Basic) возвращает объект типа элементов в коллекции. Так как каждый элемент является парой "ключ-значение", тип элемента Hashtable не является типом ключа или типа значения. Вместо этого тип элемента имеет тип DictionaryEntry. Рассмотрим пример.
foreach(DictionaryEntry de in myHashtable)
{
// ...
}
For Each de As DictionaryEntry In myHashtable
' ...
Next de
Оператор foreach представляет собой оболочку вокруг перечислителя, которая позволяет только читать из коллекции, а не записывать в нее.
Так как сериализация и десериализация перечислителя может Hashtable привести к переупорядочению элементов, невозможно продолжить перечисление без вызова Reset метода.
Note
Так как ключи могут быть унаследованы и их поведение изменено, их абсолютная уникальность не может быть гарантирована сравнением с помощью Equals метода.
Конструкторы
| Имя | Описание |
|---|---|
| Hashtable() |
Инициализирует новый, пустой экземпляр класса с помощью начальной Hashtable емкости по умолчанию, коэффициента загрузки, поставщика хэш-кода и средства сравнения. |
| Hashtable(IDictionary, IEqualityComparer) |
Инициализирует новый экземпляр Hashtable класса путем копирования элементов из указанного словаря в новый Hashtable объект. Новый Hashtable объект имеет начальную емкость, равную количеству скопированных элементов, и использует коэффициент загрузки по умолчанию и указанный IEqualityComparer объект. |
| Hashtable(IDictionary, IHashCodeProvider, IComparer) |
Устаревшие..
Устаревшие..
Инициализирует новый экземпляр Hashtable класса путем копирования элементов из указанного словаря в новый Hashtable объект. Новый Hashtable объект имеет начальную емкость, равную количеству скопированных элементов, и использует коэффициент загрузки по умолчанию, а также указанный поставщик хэш-кода и средство сравнения. Этот API устарел. Дополнительные сведения см. в статье Hashtable(IDictionary, IEqualityComparer). |
| Hashtable(IDictionary, Single, IEqualityComparer) |
Инициализирует новый экземпляр Hashtable класса путем копирования элементов из указанного словаря в новый Hashtable объект. Новый Hashtable объект имеет начальную емкость, равную количеству скопированных элементов, и использует указанный коэффициент нагрузки и IEqualityComparer объект. |
| Hashtable(IDictionary, Single, IHashCodeProvider, IComparer) |
Устаревшие..
Устаревшие..
Инициализирует новый экземпляр Hashtable класса путем копирования элементов из указанного словаря в новый Hashtable объект. Новый Hashtable объект имеет начальную емкость, равную количеству скопированных элементов, и использует указанный коэффициент нагрузки, поставщик хэш-кода и средство сравнения. |
| Hashtable(IDictionary, Single) |
Инициализирует новый экземпляр Hashtable класса путем копирования элементов из указанного словаря в новый Hashtable объект. Новый Hashtable объект имеет начальную емкость, равную количеству скопированных элементов, и использует указанный коэффициент нагрузки, а также поставщик хэш-кода по умолчанию и средство сравнения. |
| Hashtable(IDictionary) |
Инициализирует новый экземпляр Hashtable класса путем копирования элементов из указанного словаря в новый Hashtable объект. Новый Hashtable объект имеет начальную емкость, равную количеству скопированных элементов, и использует коэффициент загрузки по умолчанию, поставщик хэш-кода и средство сравнения. |
| Hashtable(IEqualityComparer) |
Инициализирует новый, пустой экземпляр класса с помощью начального коэффициента Hashtable емкости и нагрузки по умолчанию и указанного IEqualityComparer объекта. |
| Hashtable(IHashCodeProvider, IComparer) |
Устаревшие..
Устаревшие..
Устаревшие..
Инициализирует новый, пустой экземпляр Hashtable класса, используя начальный коэффициент емкости и нагрузки по умолчанию, а также указанный поставщик хэш-кода и средство сравнения. |
| Hashtable(Int32, IEqualityComparer) |
Инициализирует новый, пустой экземпляр класса с помощью указанной Hashtable начальной емкости и IEqualityComparerкоэффициента загрузки по умолчанию. |
| Hashtable(Int32, IHashCodeProvider, IComparer) |
Устаревшие..
Устаревшие..
Инициализирует новый, пустой экземпляр класса с помощью указанной Hashtable начальной емкости, поставщика хэш-кода, сравнения и коэффициента загрузки по умолчанию. |
| Hashtable(Int32, Single, IEqualityComparer) |
Инициализирует новый, пустой экземпляр класса с помощью указанной начальной емкости, коэффициента нагрузки Hashtable и IEqualityComparer объекта. |
| Hashtable(Int32, Single, IHashCodeProvider, IComparer) |
Устаревшие..
Устаревшие..
Инициализирует новый, пустой экземпляр класса с помощью указанной Hashtable начальной емкости, коэффициента загрузки, поставщика хэш-кода и средства сравнения. |
| Hashtable(Int32, Single) |
Инициализирует новый, пустой экземпляр Hashtable класса, используя указанный начальный коэффициент емкости и нагрузки, а также поставщик хэш-кода по умолчанию и средство сравнения. |
| Hashtable(Int32) |
Инициализирует новый, пустой экземпляр класса с помощью указанной Hashtable начальной емкости и коэффициента загрузки по умолчанию, поставщика хэш-кода и средства сравнения. |
| Hashtable(SerializationInfo, StreamingContext) |
Устаревшие..
Инициализирует новый пустой экземпляр Hashtable класса, который сериализуется с помощью указанных SerializationInfo и StreamingContext объектов. |
Свойства
| Имя | Описание |
|---|---|
| comparer |
Устаревшие..
Устаревшие..
Возвращает или задает используемый IComparer для параметра Hashtable. |
| Count |
Возвращает количество пар "ключ-значение", содержащихся в элементе Hashtable. |
| EqualityComparer |
Возвращает используемый IEqualityComparer для Hashtableпараметра . |
| hcp |
Устаревшие..
Устаревшие..
Возвращает или задает объект, который может выдавать хэш-коды. |
| IsFixedSize |
Возвращает значение, указывающее, имеет ли Hashtable размер фиксированного размера. |
| IsReadOnly |
Возвращает значение, указывающее, доступен ли доступ Hashtable только для чтения. |
| IsSynchronized |
Возвращает значение, указывающее, синхронизирован ли доступ к Hashtable (потокобезопасный). |
| Item[Object] |
Возвращает или задает значение, связанное с указанным ключом. |
| Keys |
Возвращает содержащий ICollection ключи в объекте Hashtable. |
| SyncRoot |
Получает объект, который можно использовать для синхронизации доступа к объекту Hashtable. |
| Values |
ICollection Возвращает значение, содержащее значения в объекте Hashtable. |
Методы
| Имя | Описание |
|---|---|
| Add(Object, Object) |
Добавляет элемент с указанным ключом и значением в элемент Hashtable. |
| Clear() |
Удаляет все элементы из элемента Hashtable. |
| Clone() |
Создает неглубокую копию Hashtable. |
| Contains(Object) |
Определяет, содержит ли Hashtable определенный ключ. |
| ContainsKey(Object) |
Определяет, содержит ли Hashtable определенный ключ. |
| ContainsValue(Object) |
Определяет, содержит ли Hashtable определенное значение. |
| CopyTo(Array, Int32) |
Копирует элементы в Hashtable одномерный Array экземпляр по указанному индексу. |
| Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
| GetEnumerator() |
Возвращает значение IDictionaryEnumerator , которое выполняет итерацию через Hashtable. |
| GetHash(Object) |
Возвращает хэш-код для указанного ключа. |
| GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
| GetObjectData(SerializationInfo, StreamingContext) |
Устаревшие..
ISerializable Реализует интерфейс и возвращает данные, необходимые для сериализацииHashtable. |
| GetType() |
Возвращает Type текущего экземпляра. (Унаследовано от Object) |
| KeyEquals(Object, Object) |
Сравнивает определенный Object ключ с определенным ключом в элементе Hashtable. |
| MemberwiseClone() |
Создает неглубокую копию текущей Object. (Унаследовано от Object) |
| OnDeserialization(Object) |
ISerializable Реализует интерфейс и вызывает событие десериализации после завершения десериализации. |
| Remove(Object) |
Удаляет элемент с указанным ключом из элемента Hashtable. |
| Synchronized(Hashtable) |
Возвращает синхронизированный (потокобезопасный) оболочку для Hashtable. |
| ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |
Явные реализации интерфейса
| Имя | Описание |
|---|---|
| IEnumerable.GetEnumerator() |
Возвращает перечислитель, который выполняет итерацию по коллекции. |
Методы расширения
| Имя | Описание |
|---|---|
| AsParallel(IEnumerable) |
Включает параллелизацию запроса. |
| AsQueryable(IEnumerable) |
Преобразует IEnumerable в IQueryable. |
| Cast<TResult>(IEnumerable) |
Приведение элементов IEnumerable к указанному типу. |
| OfType<TResult>(IEnumerable) |
Фильтрует элементы IEnumerable на основе указанного типа. |
Применяется к
Потокобезопасность
Hashtable является потокобезопасной для использования несколькими потоками чтения и одним потоком записи. Он является потокобезопасным для использования с несколькими потоками, если только один из потоков выполняет операции записи (обновления), что позволяет выполнять операции записи без блокировки, если записи сериализуются в .Hashtable Для поддержки нескольких операций Hashtable записи необходимо выполнить через оболочку, возвращаемую Synchronized(Hashtable) методом, при условии, что потоки, считывающие Hashtable объект, отсутствуют.
Перечисление через коллекцию по сути не является потокобезопасной процедурой. Даже если коллекция синхронизирована, другие потоки по-прежнему могут изменять коллекцию, что приводит к возникновению исключения перечислителем. Чтобы гарантировать безопасность потоков во время перечисления, можно заблокировать коллекцию во время всего перечисления или поймать исключения, полученные из изменений, внесенных другими потоками.