.NET Framework-Klassenbibliothek
Dictionary<(Of <(TKey, TValue>)>)-Klasse

Aktualisiert: November 2007

Stellt eine Auflistung von Schlüsseln und Werten dar.

Namespace:  System.Collections.Generic
Assembly:  mscorlib (in mscorlib.dll)
Syntax

Visual Basic (Deklaration)
<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
Visual Basic (Verwendung)
Dim instance As Dictionary(Of TKey, TValue)
C#
[SerializableAttribute]
[ComVisibleAttribute(false)]
public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>, 
    ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, 
    IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback
VisualC++
[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#
J# unterstützt die Verwendung von generischen APIs, aber nicht die Deklaration von neuen generischen APIs.
Jscript
JScript unterstützt keine generischen Typen oder Methoden.

Typparameter

TKey

Der Typ der Schlüssel im Wörterbuch.

TValue

Der Typ der Werte im Wörterbuch.

Hinweise

Die generische Dictionary<(Of <(TKey, TValue>)>)-Klasse stellt eine Zuordnung von einem Satz von Schlüsseln zu einem Satz von Werten bereit. Jede Hinzufügung zum Wörterbuch besteht aus einem Wert und dem zugeordneten Schlüssel. Ein Wert kann anhand des zugehörigen Schlüssels sehr schnell abgerufen werden (beinahe ein O(1)-Vorgang), da die Dictionary<(Of <(TKey, TValue>)>)-Klasse in Form einer Hashtabelle implementiert ist.

xfhwa508.alert_note(de-de,VS.90).gifHinweis:

Die Abrufgeschwindigkeit hängt von der Qualität des Hashalgorithmus des Typs ab, der für TKey angegeben wurde.

Wenn ein Objekt im Dictionary<(Of <(TKey, TValue>)>) als Schlüssel verwendet wird, darf es nicht auf eine Weise geändert werden, die sich auf seinen Hashwert auswirkt. Jeder Schlüssel in einem Dictionary<(Of <(TKey, TValue>)>) muss für den Gleichheitsvergleich des Wörterbuches eindeutig sein. Wenn der Werttyp TValue ein Referenztyp ist, kann ein Wert nullNothingnullptrNULL-Verweis (Nothing in Visual Basic) sein, ein Schlüssel jedoch nicht.

Dictionary<(Of <(TKey, TValue>)>) erfordert eine Gleichheitsimplementierung, um zu bestimmen, ob Schlüssel gleich sind. Sie können mithilfe eines Konstruktors, der einen comparer-Parameter akzeptiert, eine Implementierung der generischen IEqualityComparer<(Of <(T>)>)-Schnittstelle angeben. Andernfalls wird der generische Standardgleichheitsvergleich EqualityComparer<(Of <(T>)>)..::.Default verwendet. Wenn der Typ TKey die generische System..::.IEquatable<(Of <(T>)>)-Schnittstelle implementiert, verwendet der Standardgleichheitsvergleich diese Implementierung.

xfhwa508.alert_note(de-de,VS.90).gifHinweis:

Sie können diese von der StringComparer-Klasse bereitgestellten Zeichenfolgenvergleiche ohne Berücksichtigung der Groß- und Kleinschreibung beispielsweise verwenden, um Wörterbücher mit Zeichenfolgenschlüsseln zu erstellen, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird.

Die Kapazität eines Dictionary<(Of <(TKey, TValue>)>) gibt die Anzahl der Elemente an, die das Dictionary<(Of <(TKey, TValue>)>) aufnehmen kann. Wenn einem Dictionary<(Of <(TKey, TValue>)>) Elemente hinzugefügt werden, wird die Kapazität durch die Neuzuordnung des internen Arrays automatisch nach Bedarf erhöht.

Zu Enumerationszwecken wird jedes Element im Wörterbuch als KeyValuePair<(Of <(TKey, TValue>)>)-Struktur behandelt, die einen Wert und seinen zugehörigen Schlüssel darstellt. Die Reihenfolge, in der die Elemente zurückgegeben werden, ist nicht definiert.

Für die foreach-Anweisung in C# (for each in C++, For Each in Visual Basic) ist der Typ jedes Elements in der Auflistung erforderlich. Da es sich bei Dictionary<(Of <(TKey, TValue>)>) um eine Auflistung von Schlüsseln und Werten handelt, ist der Elementtyp weder der Typ des Schlüssels noch der des Werts. Der Elementtyp ist ein KeyValuePair<(Of <(TKey, TValue>)>) vom Typ des Schlüssels und des Werts. Beispiel:

C#
foreach (KeyValuePair<int, string> kvp in myDictionary) {...}
VisualC++
for each (KeyValuePair<int, String^> kvp in myDictionary) {...}
Visual Basic
For Each kvp As KeyValuePair(Of Integer, String) In myDictionary
    ...
Next kvp

Die foreach-Anweisung fungiert als Wrapper für den Enumerator, der nur das Lesen aus der Auflistung, nicht jedoch das Schreiben in diese zulässt.

xfhwa508.alert_note(de-de,VS.90).gifHinweis:

Da Schlüssel geerbt und ihr Verhalten geändert werden kann, kann ihre absolute Eindeutigkeit bei Vergleichen mit der Equals-Methode nicht garantiert werden.

Beispiele

Im folgenden Codebeispiel wird ein leeres Dictionary<(Of <(TKey, TValue>)>) von Zeichenfolgen mit Zeichenfolgenschlüsseln erstellt, und mithilfe der Add-Methode werden einige Elemente hinzugefügt. Im Beispiel wird veranschaulicht, dass die Add-Methode beim Versuch des Hinzufügens eines doppelten Schlüssels eine ArgumentException auslöst.

Im Beispiel werden die Werte mithilfe der Item-Eigenschaft (Indexer in C#) abgerufen. Dies veranschaulicht, dass eine KeyNotFoundException ausgelöst wird, wenn ein angeforderter Schlüssel nicht vorhanden ist. Außerdem wird gezeigt, dass ein einem Schlüssel zugeordneter Wert ersetzt werden kann.

In diesem Beispiel wird gezeigt, wie Werte mithilfe der TryGetValue-Methode effizienter abgerufen werden können, wenn ein Programm häufig versucht, auf Schlüsselwerte zuzugreifen, die nicht im Wörterbuch enthalten sind. Außerdem wird veranschaulicht, wie vor dem Aufrufen der Add-Methode mithilfe der ContainsKey-Methode geprüft werden kann, ob ein Schlüssel vorhanden ist.

Im Beispiel wird gezeigt, wie die Schlüssel und Werte im Wörterbuch oder eigenständig anhand der Keys-Eigenschaft und der Values aufgelistet werden können.

Abschließend wird im Beispiel die Remove-Methode aufgerufen.

Visual Basic
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.
' 
C#
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.
 */
Vererbungshierarchie

System..::.Object
  System.Collections.Generic..::.Dictionary<(Of <(TKey, TValue>)>)
Threadsicherheit

Öffentliche statische (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

Dictionary<(Of <(TKey, TValue>)>) stellt eine gleichzeitige Unterstützung für mehrere Reader bereit, sofern die Auflistung nicht verändert wird. Die Enumeration einer Auflistung ist jedoch systembedingt in keinem Fall eine threadsichere Prozedur. In seltenen Fällen können Konflikte zwischen einer Enumeration und den Schreibzugriffen auftreten. In einem solchen Fall muss die Auflistung während der gesamten Enumeration gesperrt werden. Um den Lese- und Schreibzugriff auf diese Auflistung durch mehrere Threads zuzulassen, müssen Sie eine eigene Synchronisierung implementieren.

Plattformen

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile für Smartphone, Windows Mobile für Pocket PC, Xbox 360

.NET Framework und .NET Compact Framework unterstützen nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.
Versionsinformationen

.NET Framework

Unterstützt in: 3.5, 3.0, 2.0

.NET Compact Framework

Unterstützt in: 3.5, 2.0

XNA Framework

Unterstützt in: 2.0, 1.0
Siehe auch

Referenz

Tags :


Page view tracker