Assembly : mscorlib (dans mscorlib.dll)
Syntaxe<SerializableAttribute> _ <ComVisibleAttribute(False)> _ Public Class Dictionary(Of TKey, TValue) Implements IDictionary(Of TKey, TValue), ICollection(Of KeyValuePair(Of TKey, TValue)), _ IEnumerable(Of KeyValuePair(Of TKey, TValue)), IDictionary, ICollection, _ IEnumerable, ISerializable, IDeserializationCallback
Dim instance As Dictionary(Of TKey, TValue)
[SerializableAttribute] [ComVisibleAttribute(false)] public class Dictionary<TKey,TValue> : IDictionary<TKey,TValue>, ICollection<KeyValuePair<TKey,TValue>>, IEnumerable<KeyValuePair<TKey,TValue>>, IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback
[SerializableAttribute] [ComVisibleAttribute(false)] generic<typename TKey, typename TValue> public ref class Dictionary : IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback
J# prend en charge l'utilisation de types et de méthodes génériques mais pas la déclaration de nouveaux types et de méthodes génériques.
JScript ne prend pas en charge les types et les méthodes génériques.
Paramètres de type
- TKey
Type des clés dans le dictionnaire.
- TValue
Type des valeurs dans le dictionnaire.
NotesLa classe générique Dictionary fournit un mappage à partir d'un jeu de clés à un jeu de valeurs. Chaque ajout au dictionnaire se compose d'une valeur et de sa clé associée. La récupération d'une valeur à l'aide de sa clé est très rapide, proche de O(1), parce que la classe Dictionary est implémentée comme une table de hachage.
Remarque |
|---|
| La vitesse de récupération dépend de la qualité de l'algorithme de hachage du type spécifié pour TKey. |
Tant qu'un objet est utilisé comme une clé dans Dictionary, il ne doit subir aucune modification qui affecte sa valeur de hachage. Chaque clé contenue dans Dictionary doit être unique conformément au comparateur d'égalité du dictionnaire. Une clé ne peut pas être référence Null (Nothing en Visual Basic), mais une valeur peut l'être, si le type valeur TValue est un type référence.
Dictionary requiert l'implémentation d'une égalité pour déterminer si les clés sont égales. Vous pouvez spécifier une implémentation de l'interface générique IEqualityComparer en utilisant un constructeur qui accepte un paramètre comparer ; si vous ne spécifiez pas d'implémentation, le comparateur générique d'égalité par défaut EqualityComparer.Default est utilisé. Si le type TKey implémente l'interface générique System.IEquatable, le comparateur d'égalité par défaut utilise cette implémentation.
Remarque |
|---|
| Par exemple, vous pouvez utiliser les comparateurs de chaînes ne respectant pas la casse fournis par la classe StringComparer pour créer des dictionnaires avec des clés de type chaîne ne respectant pas la casse. |
La capacité de Dictionary correspond au nombre d'éléments que peut contenir Dictionary. Dans cette implémentation, la capacité initiale par défaut pour Dictionary est 3 ; toutefois, cette valeur par défaut est susceptible de changer dans les futures versions du .NET Framework. Lorsque des éléments sont ajoutés à Dictionary, la capacité est automatiquement augmentée, si nécessaire, en réallouant le tableau interne.
À des fins d'énumération, chaque élément dans le dictionnaire est traité comme une structure KeyValuePair qui représente une valeur et sa clé. L'ordre dans lequel les éléments sont retournés est non défini.
L'instruction foreach du langage C# (for each en C++, For Each en Visual Basic) requiert le type de chaque élément de la collection. Comme Dictionary est une collection de clés et de valeurs, le type d'élément n'est pas le type de la clé ou le type de la valeur. À la place, le type d'élément est KeyValuePair du type de clé et du type valeur. Exemple :
foreach (KeyValuePair<int, string> kvp in myDictionary) {...}
for each (KeyValuePair<int, String^> kvp in myDictionary) {...}
For Each kvp As KeyValuePair(Of Integer, String) In myDictionary ... Next kvp
L'instruction foreach est un wrapper autour de l'énumérateur, qui permet la lecture à partir de la collection, mais non l'écriture dans celle-ci.
ExempleL'exemple de code suivant crée un Dictionary de chaînes vide, avec des clés de chaînes, et utilise la méthode Add pour ajouter certains éléments. L'exemple montre que la méthode Add lève ArgumentException lors de la tentative d'ajout d'une clé dupliquée.
L'exemple utilise la propriété Item (l'indexeur en C#) pour récupérer des valeurs, démontrant qu'une KeyNotFoundException est levée lorsqu'une clé demandée n'est pas présente et indiquant que la valeur associée à une clé peut être remplacée.
L'exemple montre comment utiliser la méthode TryGetValue comme un moyen plus efficace de récupérer des valeurs si un programme doit souvent essayer des valeurs de clés qui ne sont pas dans le dictionnaire, et montre comment utiliser la méthode ContainsKey pour tester si une clé existe avant d'appeler la méthode Add.
L'exemple montre comment énumérer les clés et les valeurs du dictionnaire et comment énumérer les clés et les valeurs seules à l'aide de la propriété Keys et de la propriété Values.
Enfin, l'exemple illustre la méthode Remove.
Imports System Imports System.Collections.Generic Public Class Example Public Shared Sub Main() ' Create a new dictionary of strings, with string keys. ' Dim openWith As New Dictionary(Of String, String) ' Add some elements to the dictionary. 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 dictionary. 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" ' The default Item property throws an exception if the requested ' key is not in the dictionary. Try Console.WriteLine("For key = ""tif"", value = {0}.", _ openWith("tif")) Catch Console.WriteLine("Key = ""tif"" is not found.") End Try ' When a program often has to try keys that turn out not to ' be in the dictionary, TryGetValue can be a more efficient ' way to retrieve values. Dim value As String = "" If openWith.TryGetValue("tif", value) Then Console.WriteLine("For key = ""tif"", value = {0}.", value) Else Console.WriteLine("Key = ""tif"" is not found.") End If ' 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 dictionary elements, ' the elements are retrieved as KeyValuePair objects. Console.WriteLine() For Each kvp As KeyValuePair(Of String, String) In openWith Console.WriteLine("Key = {0}, Value = {1}", _ kvp.Key, kvp.Value) Next kvp ' To get the values alone, use the Values property. Dim valueColl As _ Dictionary(Of String, String).ValueCollection = _ openWith.Values ' The elements of the ValueCollection are strongly typed ' with the type that was specified for dictionary 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 _ Dictionary(Of String, String).KeyCollection = _ openWith.Keys ' The elements of the KeyCollection are strongly typed ' with the type that was specified for dictionary 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 Class ' 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. 'Key = "tif" is not found. 'Key = "tif" is not found. 'Value added for key = "ht": hypertrm.exe ' 'Key = txt, Value = notepad.exe 'Key = bmp, Value = paint.exe 'Key = dib, Value = paint.exe 'Key = rtf, Value = winword.exe 'Key = doc, Value = winword.exe 'Key = ht, Value = hypertrm.exe ' 'Value = notepad.exe 'Value = paint.exe 'Value = paint.exe 'Value = winword.exe 'Value = winword.exe 'Value = hypertrm.exe ' 'Key = txt 'Key = bmp 'Key = dib 'Key = rtf 'Key = doc 'Key = ht ' 'Remove("doc") 'Key "doc" is not found. '
using System; using System.Collections.Generic; public class Example { public static void Main() { // Create a new dictionary of strings, with string keys. // Dictionary<string, string> openWith = new Dictionary<string, string>(); // Add some elements to the dictionary. 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 dictionary. try { openWith.Add("txt", "winword.exe"); } catch (ArgumentException) { Console.WriteLine("An element with Key = \"txt\" already exists."); } // The Item property is another name for the indexer, so you // can omit its name when accessing elements. Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]); // The indexer 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 indexer for that key // adds a new key/value pair. openWith["doc"] = "winword.exe"; // The indexer throws an exception if the requested key is // not in the dictionary. try { Console.WriteLine("For key = \"tif\", value = {0}.", openWith["tif"]); } catch (KeyNotFoundException) { Console.WriteLine("Key = \"tif\" is not found."); } // When a program often has to try keys that turn out not to // be in the dictionary, TryGetValue can be a more efficient // way to retrieve values. string value = ""; if (openWith.TryGetValue("tif", out value)) { Console.WriteLine("For key = \"tif\", value = {0}.", value); } else { Console.WriteLine("Key = \"tif\" is not found."); } // 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 dictionary elements, // the elements are retrieved as KeyValuePair objects. Console.WriteLine(); foreach( KeyValuePair<string, string> kvp in openWith ) { Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value); } // To get the values alone, use the Values property. Dictionary<string, string>.ValueCollection valueColl = openWith.Values; // The elements of the ValueCollection are strongly typed // with the type that was specified for dictionary values. Console.WriteLine(); foreach( string s in valueColl ) { Console.WriteLine("Value = {0}", s); } // To get the keys alone, use the Keys property. Dictionary<string, string>.KeyCollection keyColl = openWith.Keys; // The elements of the KeyCollection are strongly typed // with the type that was specified for dictionary 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. Key = "tif" is not found. Key = "tif" is not found. Value added for key = "ht": hypertrm.exe Key = txt, Value = notepad.exe Key = bmp, Value = paint.exe Key = dib, Value = paint.exe Key = rtf, Value = winword.exe Key = doc, Value = winword.exe Key = ht, Value = hypertrm.exe Value = notepad.exe Value = paint.exe Value = paint.exe Value = winword.exe Value = winword.exe Value = hypertrm.exe Key = txt Key = bmp Key = dib Key = rtf Key = doc Key = ht Remove("doc") Key "doc" is not found. */
Sécurité des threadsLes membres statiques publics (Shared en Visual Basic) de ce type sont thread-safe. Il n'est pas garanti que les membres d'instance soient thread-safe.
Dictionary peut prendre simultanément en charge plusieurs lecteurs, tant que la collection n'est pas modifiée. Même dans ce cas, l'énumération d'une collection n'est intrinsèquement pas une procédure thread-safe. Dans le cas rare où une énumération traite des accès en écriture, la collection doit être verrouillée pendant l'énumération entière. Pour permettre à plusieurs threads d'accéder en lecture et en écriture à la collection, vous devez implémenter votre propre synchronisation.
Plates-formesWindows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile pour Pocket PC, Windows Mobile pour Smartphone, Windows Server 2003, Windows XP Édition Media Center, Windows XP Professionnel Édition x64, Windows XP SP2, Windows XP Starter Edition
Le .NET Framework ne prend pas en charge toutes les versions de chaque plate-forme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise.
Informations de version
Remarque
Outils (masquer)
S'enregistrer
Liste des Membres
Qui est en ligne?
FAQ