DictionaryBase Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Stellt die abstract Basisklasse für eine stark typierte Auflistung von Schlüssel-Wert-Paaren bereit.
public ref class DictionaryBase abstract : System::Collections::IDictionary
public abstract class DictionaryBase : System.Collections.IDictionary
[System.Serializable]
public abstract class DictionaryBase : System.Collections.IDictionary
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class DictionaryBase : System.Collections.IDictionary
type DictionaryBase = class
interface ICollection
interface IEnumerable
interface IDictionary
[<System.Serializable>]
type DictionaryBase = class
interface IDictionary
interface ICollection
interface IEnumerable
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type DictionaryBase = class
interface IDictionary
interface ICollection
interface IEnumerable
Public MustInherit Class DictionaryBase
Implements IDictionary
- Vererbung
-
DictionaryBase
- Abgeleitet
- Attribute
- Implementiert
Beispiele
Das folgende Codebeispiel implementiert die DictionaryBase Klasse und verwendet diese Implementierung zum Erstellen eines Wörterbuchs mit String Schlüsseln und Werten mit Length 5 Zeichen oder weniger.
using System;
using System.Collections;
public class ShortStringDictionary : DictionaryBase {
public String this[ String key ] {
get {
return( (String) Dictionary[key] );
}
set {
Dictionary[key] = value;
}
}
public ICollection Keys {
get {
return( Dictionary.Keys );
}
}
public ICollection Values {
get {
return( Dictionary.Values );
}
}
public void Add( String key, String value ) {
Dictionary.Add( key, value );
}
public bool Contains( String key ) {
return( Dictionary.Contains( key ) );
}
public void Remove( String key ) {
Dictionary.Remove( key );
}
protected override void OnInsert( Object key, Object value ) {
if ( key.GetType() != typeof(System.String) )
{
throw new ArgumentException( "key must be of type String.", "key" );
}
else {
String strKey = (String) key;
if ( strKey.Length > 5 )
throw new ArgumentException( "key must be no more than 5 characters in length.", "key" );
}
if ( value.GetType() != typeof(System.String) )
{
throw new ArgumentException( "value must be of type String.", "value" );
}
else {
String strValue = (String) value;
if ( strValue.Length > 5 )
throw new ArgumentException( "value must be no more than 5 characters in length.", "value" );
}
}
protected override void OnRemove( Object key, Object value ) {
if ( key.GetType() != typeof(System.String) )
{
throw new ArgumentException( "key must be of type String.", "key" );
}
else {
String strKey = (String) key;
if ( strKey.Length > 5 )
throw new ArgumentException( "key must be no more than 5 characters in length.", "key" );
}
}
protected override void OnSet( Object key, Object oldValue, Object newValue ) {
if ( key.GetType() != typeof(System.String) )
{
throw new ArgumentException( "key must be of type String.", "key" );
}
else {
String strKey = (String) key;
if ( strKey.Length > 5 )
throw new ArgumentException( "key must be no more than 5 characters in length.", "key" );
}
if ( newValue.GetType() != typeof(System.String) )
{
throw new ArgumentException( "newValue must be of type String.", "newValue" );
}
else {
String strValue = (String) newValue;
if ( strValue.Length > 5 )
throw new ArgumentException( "newValue must be no more than 5 characters in length.", "newValue" );
}
}
protected override void OnValidate( Object key, Object value ) {
if ( key.GetType() != typeof(System.String) )
{
throw new ArgumentException( "key must be of type String.", "key" );
}
else {
String strKey = (String) key;
if ( strKey.Length > 5 )
throw new ArgumentException( "key must be no more than 5 characters in length.", "key" );
}
if ( value.GetType() != typeof(System.String) )
{
throw new ArgumentException( "value must be of type String.", "value" );
}
else {
String strValue = (String) value;
if ( strValue.Length > 5 )
throw new ArgumentException( "value must be no more than 5 characters in length.", "value" );
}
}
}
public class SamplesDictionaryBase {
public static void Main() {
// Creates and initializes a new DictionaryBase.
ShortStringDictionary mySSC = new ShortStringDictionary();
// Adds elements to the collection.
mySSC.Add( "One", "a" );
mySSC.Add( "Two", "ab" );
mySSC.Add( "Three", "abc" );
mySSC.Add( "Four", "abcd" );
mySSC.Add( "Five", "abcde" );
// Display the contents of the collection using foreach. This is the preferred method.
Console.WriteLine( "Contents of the collection (using foreach):" );
PrintKeysAndValues1( mySSC );
// Display the contents of the collection using the enumerator.
Console.WriteLine( "Contents of the collection (using enumerator):" );
PrintKeysAndValues2( mySSC );
// Display the contents of the collection using the Keys property and the Item property.
Console.WriteLine( "Initial contents of the collection (using Keys and Item):" );
PrintKeysAndValues3( mySSC );
// Tries to add a value that is too long.
try {
mySSC.Add( "Ten", "abcdefghij" );
}
catch ( ArgumentException e ) {
Console.WriteLine( e.ToString() );
}
// Tries to add a key that is too long.
try {
mySSC.Add( "Eleven", "ijk" );
}
catch ( ArgumentException e ) {
Console.WriteLine( e.ToString() );
}
Console.WriteLine();
// Searches the collection with Contains.
Console.WriteLine( "Contains \"Three\": {0}", mySSC.Contains( "Three" ) );
Console.WriteLine( "Contains \"Twelve\": {0}", mySSC.Contains( "Twelve" ) );
Console.WriteLine();
// Removes an element from the collection.
mySSC.Remove( "Two" );
// Displays the contents of the collection.
Console.WriteLine( "After removing \"Two\":" );
PrintKeysAndValues1( mySSC );
}
// Uses the foreach statement which hides the complexity of the enumerator.
// NOTE: The foreach statement is the preferred way of enumerating the contents of a collection.
public static void PrintKeysAndValues1( ShortStringDictionary myCol ) {
foreach ( DictionaryEntry myDE in myCol )
Console.WriteLine( " {0,-5} : {1}", myDE.Key, myDE.Value );
Console.WriteLine();
}
// Uses the enumerator.
// NOTE: The foreach statement is the preferred way of enumerating the contents of a collection.
public static void PrintKeysAndValues2( ShortStringDictionary myCol ) {
DictionaryEntry myDE;
System.Collections.IEnumerator myEnumerator = myCol.GetEnumerator();
while ( myEnumerator.MoveNext() )
if ( myEnumerator.Current != null ) {
myDE = (DictionaryEntry) myEnumerator.Current;
Console.WriteLine( " {0,-5} : {1}", myDE.Key, myDE.Value );
}
Console.WriteLine();
}
// Uses the Keys property and the Item property.
public static void PrintKeysAndValues3( ShortStringDictionary myCol ) {
ICollection myKeys = myCol.Keys;
foreach ( String k in myKeys )
Console.WriteLine( " {0,-5} : {1}", k, myCol[k] );
Console.WriteLine();
}
}
/*
This code produces the following output.
Contents of the collection (using foreach):
Three : abc
Five : abcde
Two : ab
One : a
Four : abcd
Contents of the collection (using enumerator):
Three : abc
Five : abcde
Two : ab
One : a
Four : abcd
Initial contents of the collection (using Keys and Item):
Three : abc
Five : abcde
Two : ab
One : a
Four : abcd
System.ArgumentException: value must be no more than 5 characters in length.
Parameter name: value
at ShortStringDictionary.OnValidate(Object key, Object value)
at System.Collections.DictionaryBase.System.Collections.IDictionary.Add(Object key, Object value)
at SamplesDictionaryBase.Main()
System.ArgumentException: key must be no more than 5 characters in length.
Parameter name: key
at ShortStringDictionary.OnValidate(Object key, Object value)
at System.Collections.DictionaryBase.System.Collections.IDictionary.Add(Object key, Object value)
at SamplesDictionaryBase.Main()
Contains "Three": True
Contains "Twelve": False
After removing "Two":
Three : abc
Five : abcde
One : a
Four : abcd
*/
Imports System.Collections
Public Class ShortStringDictionary
Inherits DictionaryBase
Default Public Property Item(key As String) As String
Get
Return CType(Dictionary(key), String)
End Get
Set
Dictionary(key) = value
End Set
End Property
Public ReadOnly Property Keys() As ICollection
Get
Return Dictionary.Keys
End Get
End Property
Public ReadOnly Property Values() As ICollection
Get
Return Dictionary.Values
End Get
End Property
Public Sub Add(key As String, value As String)
Dictionary.Add(key, value)
End Sub
Public Function Contains(key As String) As Boolean
Return Dictionary.Contains(key)
End Function 'Contains
Public Sub Remove(key As String)
Dictionary.Remove(key)
End Sub
Protected Overrides Sub OnInsert(key As Object, value As Object)
If Not GetType(System.String).IsAssignableFrom(key.GetType()) Then
Throw New ArgumentException("key must be of type String.", "key")
Else
Dim strKey As String = CType(key, String)
If strKey.Length > 5 Then
Throw New ArgumentException("key must be no more than 5 characters in length.", "key")
End If
End If
If Not GetType(System.String).IsAssignableFrom(value.GetType()) Then
Throw New ArgumentException("value must be of type String.", "value")
Else
Dim strValue As String = CType(value, String)
If strValue.Length > 5 Then
Throw New ArgumentException("value must be no more than 5 characters in length.", "value")
End If
End If
End Sub
Protected Overrides Sub OnRemove(key As Object, value As Object)
If Not GetType(System.String).IsAssignableFrom(key.GetType()) Then
Throw New ArgumentException("key must be of type String.", "key")
Else
Dim strKey As String = CType(key, String)
If strKey.Length > 5 Then
Throw New ArgumentException("key must be no more than 5 characters in length.", "key")
End If
End If
End Sub
Protected Overrides Sub OnSet(key As Object, oldValue As Object, newValue As Object)
If Not GetType(System.String).IsAssignableFrom(key.GetType()) Then
Throw New ArgumentException("key must be of type String.", "key")
Else
Dim strKey As String = CType(key, String)
If strKey.Length > 5 Then
Throw New ArgumentException("key must be no more than 5 characters in length.", "key")
End If
End If
If Not GetType(System.String).IsAssignableFrom(newValue.GetType()) Then
Throw New ArgumentException("newValue must be of type String.", "newValue")
Else
Dim strValue As String = CType(newValue, String)
If strValue.Length > 5 Then
Throw New ArgumentException("newValue must be no more than 5 characters in length.", "newValue")
End If
End If
End Sub
Protected Overrides Sub OnValidate(key As Object, value As Object)
If Not GetType(System.String).IsAssignableFrom(key.GetType()) Then
Throw New ArgumentException("key must be of type String.", "key")
Else
Dim strKey As String = CType(key, String)
If strKey.Length > 5 Then
Throw New ArgumentException("key must be no more than 5 characters in length.", "key")
End If
End If
If Not GetType(System.String).IsAssignableFrom(value.GetType()) Then
Throw New ArgumentException("value must be of type String.", "value")
Else
Dim strValue As String = CType(value, String)
If strValue.Length > 5 Then
Throw New ArgumentException("value must be no more than 5 characters in length.", "value")
End If
End If
End Sub
End Class
Public Class SamplesDictionaryBase
Public Shared Sub Main()
' Creates and initializes a new DictionaryBase.
Dim mySSC As New ShortStringDictionary()
' Adds elements to the collection.
mySSC.Add("One", "a")
mySSC.Add("Two", "ab")
mySSC.Add("Three", "abc")
mySSC.Add("Four", "abcd")
mySSC.Add("Five", "abcde")
' Display the contents of the collection using For Each. This is the preferred method.
Console.WriteLine("Contents of the collection (using For Each):")
PrintKeysAndValues1(mySSC)
' Display the contents of the collection using the enumerator.
Console.WriteLine("Contents of the collection (using enumerator):")
PrintKeysAndValues2(mySSC)
' Display the contents of the collection using the Keys property and the Item property.
Console.WriteLine("Initial contents of the collection (using Keys and Item):")
PrintKeysAndValues3(mySSC)
' Tries to add a value that is too long.
Try
mySSC.Add("Ten", "abcdefghij")
Catch e As ArgumentException
Console.WriteLine(e.ToString())
End Try
' Tries to add a key that is too long.
Try
mySSC.Add("Eleven", "ijk")
Catch e As ArgumentException
Console.WriteLine(e.ToString())
End Try
Console.WriteLine()
' Searches the collection with Contains.
Console.WriteLine("Contains ""Three"": {0}", mySSC.Contains("Three"))
Console.WriteLine("Contains ""Twelve"": {0}", mySSC.Contains("Twelve"))
Console.WriteLine()
' Removes an element from the collection.
mySSC.Remove("Two")
' Displays the contents of the collection.
Console.WriteLine("After removing ""Two"":")
PrintKeysAndValues1(mySSC)
End Sub
' Uses the For Each statement which hides the complexity of the enumerator.
' NOTE: The For Each statement is the preferred way of enumerating the contents of a collection.
Public Shared Sub PrintKeysAndValues1(myCol As ShortStringDictionary)
Dim myDE As DictionaryEntry
For Each myDE In myCol
Console.WriteLine(" {0,-5} : {1}", myDE.Key, myDE.Value)
Next myDE
Console.WriteLine()
End Sub
' Uses the enumerator.
' NOTE: The For Each statement is the preferred way of enumerating the contents of a collection.
Public Shared Sub PrintKeysAndValues2(myCol As ShortStringDictionary)
Dim myDE As DictionaryEntry
Dim myEnumerator As System.Collections.IEnumerator = myCol.GetEnumerator()
While myEnumerator.MoveNext()
If Not (myEnumerator.Current Is Nothing) Then
myDE = CType(myEnumerator.Current, DictionaryEntry)
Console.WriteLine(" {0,-5} : {1}", myDE.Key, myDE.Value)
End If
End While
Console.WriteLine()
End Sub
' Uses the Keys property and the Item property.
Public Shared Sub PrintKeysAndValues3(myCol As ShortStringDictionary)
Dim myKeys As ICollection = myCol.Keys
Dim k As String
For Each k In myKeys
Console.WriteLine(" {0,-5} : {1}", k, myCol(k))
Next k
Console.WriteLine()
End Sub
End Class
'This code produces the following output.
'
'Contents of the collection (using For Each):
' Three : abc
' Five : abcde
' Two : ab
' One : a
' Four : abcd
'
'Contents of the collection (using enumerator):
' Three : abc
' Five : abcde
' Two : ab
' One : a
' Four : abcd
'
'Initial contents of the collection (using Keys and Item):
' Three : abc
' Five : abcde
' Two : ab
' One : a
' Four : abcd
'
'System.ArgumentException: value must be no more than 5 characters in length.
'Parameter name: value
' at ShortStringDictionary.OnValidate(Object key, Object value)
' at System.Collections.DictionaryBase.System.Collections.IDictionary.Add(Object key, Object value)
' at SamplesDictionaryBase.Main()
'System.ArgumentException: key must be no more than 5 characters in length.
'Parameter name: key
' at ShortStringDictionary.OnValidate(Object key, Object value)
' at System.Collections.DictionaryBase.System.Collections.IDictionary.Add(Object key, Object value)
' at SamplesDictionaryBase.Main()
'
'Contains "Three": True
'Contains "Twelve": False
'
'After removing "Two":
' Three : abc
' Five : abcde
' One : a
' Four : abcd
Hinweise
Von Bedeutung
Es wird nicht empfohlen, die DictionaryBase Klasse für die neue Entwicklung zu verwenden. Stattdessen wird empfohlen, die generische Dictionary<TKey,TValue> oder KeyedCollection<TKey,TItem> Klasse zu verwenden. Weitere Informationen finden Sie unter "Nicht generische Sammlungen", die nicht auf GitHub verwendet werden sollten .
Die C# foreach-Anweisung und die Visual Basic For Each-Anweisung geben ein Objekt des Typs der Elemente in der Auflistung zurück. Da jedes Element ein DictionaryBase Schlüssel-Wert-Paar ist, ist der Elementtyp nicht der Typ des Schlüssels oder des Typs des Werts. Stattdessen lautet DictionaryEntryder Elementtyp .
Die foreach Anweisung ist ein Wrapper um den Enumerator, der nur das Lesen von , nicht schreiben in die Auflistung ermöglicht.
Note
Da Schlüssel geerbt und ihr Verhalten geändert werden kann, kann ihre absolute Eindeutigkeit nicht durch Vergleiche mit der Equals Methode garantiert werden.
Hinweise für Ausführende
Diese Basisklasse wird bereitgestellt, um Implementierungen zu vereinfachen, um eine stark typierte benutzerdefinierte Auflistung zu erstellen. Implementierungen werden ermutigt, diese Basisklasse zu erweitern, anstatt eigene zu erstellen.
Member dieser Basisklasse sind geschützt und sollen nur über eine abgeleitete Klasse verwendet werden.
Konstruktoren
| Name | Beschreibung |
|---|---|
| DictionaryBase() |
Initialisiert eine neue Instanz der DictionaryBase-Klasse. |
Eigenschaften
| Name | Beschreibung |
|---|---|
| Count |
Ruft die Anzahl der In der DictionaryBase Instanz enthaltenen Elemente ab. |
| Dictionary |
Ruft die Liste der In der DictionaryBase Instanz enthaltenen Elemente ab. |
| InnerHashtable |
Ruft die Liste der In der DictionaryBase Instanz enthaltenen Elemente ab. |
Methoden
| Name | Beschreibung |
|---|---|
| Clear() |
Löscht den Inhalt der DictionaryBase Instanz. |
| CopyTo(Array, Int32) |
Kopiert die DictionaryBase Elemente in einen eindimensionalen Array Index. |
| Equals(Object) |
Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht. (Geerbt von Object) |
| GetEnumerator() |
Gibt einen IDictionaryEnumerator Wert zurück, der die DictionaryBase Instanz durchläuft. |
| GetHashCode() |
Dient als Standardhashfunktion. (Geerbt von Object) |
| GetType() |
Ruft die Type der aktuellen Instanz ab. (Geerbt von Object) |
| MemberwiseClone() |
Erstellt eine flache Kopie der aktuellen Object. (Geerbt von Object) |
| OnClear() |
Führt zusätzliche benutzerdefinierte Prozesse aus, bevor der Inhalt der DictionaryBase Instanz gelöscht wird. |
| OnClearComplete() |
Führt zusätzliche benutzerdefinierte Prozesse aus, nachdem der Inhalt der DictionaryBase Instanz gelöscht wurde. |
| OnGet(Object, Object) |
Ruft das Element mit dem angegebenen Schlüssel und Wert in der DictionaryBase Instanz ab. |
| OnInsert(Object, Object) |
Führt zusätzliche benutzerdefinierte Prozesse aus, bevor ein neues Element in die DictionaryBase Instanz eingefügt wird. |
| OnInsertComplete(Object, Object) |
Führt zusätzliche benutzerdefinierte Prozesse aus, nachdem ein neues Element in die DictionaryBase Instanz eingefügt wurde. |
| OnRemove(Object, Object) |
Führt zusätzliche benutzerdefinierte Prozesse aus, bevor ein Element aus der DictionaryBase Instanz entfernt wird. |
| OnRemoveComplete(Object, Object) |
Führt zusätzliche benutzerdefinierte Prozesse aus, nachdem ein Element aus der DictionaryBase Instanz entfernt wurde. |
| OnSet(Object, Object, Object) |
Führt zusätzliche benutzerdefinierte Prozesse aus, bevor ein Wert in der DictionaryBase Instanz festgelegt wird. |
| OnSetComplete(Object, Object, Object) |
Führt nach dem Festlegen eines Werts in der DictionaryBase Instanz weitere benutzerdefinierte Prozesse aus. |
| OnValidate(Object, Object) |
Führt zusätzliche benutzerdefinierte Prozesse aus, wenn das Element mit dem angegebenen Schlüssel und Wert überprüft wird. |
| ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |
Explizite Schnittstellenimplementierungen
| Name | Beschreibung |
|---|---|
| ICollection.IsSynchronized |
Ruft einen Wert ab, der angibt, ob der Zugriff auf ein DictionaryBase Objekt synchronisiert wird (Threadsicher). |
| ICollection.SyncRoot |
Ruft ein Objekt ab, das zum Synchronisieren des Zugriffs auf ein DictionaryBase Objekt verwendet werden kann. |
| IDictionary.Add(Object, Object) |
Fügt ein Element mit dem angegebenen Schlüssel und Wert in den DictionaryBase. |
| IDictionary.Contains(Object) |
Bestimmt, ob die DictionaryBase einen bestimmten Schlüssel enthält. |
| IDictionary.IsFixedSize |
Ruft einen Wert ab, der angibt, ob ein DictionaryBase Objekt eine feste Größe aufweist. |
| IDictionary.IsReadOnly |
Ruft einen Wert ab, der angibt, ob ein DictionaryBase Objekt schreibgeschützt ist. |
| IDictionary.Item[Object] |
Dient zum Abrufen oder Festlegen des Werts, der dem angegebenen Schlüssel zugeordnet ist. |
| IDictionary.Keys |
Ruft ein ICollection Objekt ab, das die Schlüssel im DictionaryBase Objekt enthält. |
| IDictionary.Remove(Object) |
Entfernt das Element mit dem angegebenen Schlüssel aus dem DictionaryBase. |
| IDictionary.Values |
Ruft ein ICollection Objekt ab, das DictionaryBase die Werte im Objekt enthält. |
| IEnumerable.GetEnumerator() |
Gibt einen IEnumerator Wert zurück, der durch die DictionaryBase. |
Erweiterungsmethoden
| Name | Beschreibung |
|---|---|
| AsParallel(IEnumerable) |
Aktiviert die Parallelisierung einer Abfrage. |
| AsQueryable(IEnumerable) |
Wandelt eine IEnumerable in eine IQueryableum. |
| Cast<TResult>(IEnumerable) |
Wandelt die Elemente eines IEnumerable in den angegebenen Typ um. |
| OfType<TResult>(IEnumerable) |
Filtert die Elemente einer IEnumerable basierend auf einem angegebenen Typ. |
Gilt für:
Threadsicherheit
Öffentliche statische Elemente (Shared in Visual Basic) dieses Typs sind threadsicher. Instanzenmitglieder sind nicht garantiert threadsicher.
Diese Implementierung stellt keinen synchronisierten (threadsicheren) Wrapper für eine DictionaryBase, abgeleitete Klassen können jedoch eigene synchronisierte Versionen der DictionaryBase Eigenschaft SyncRoot erstellen.
Das Aufzählen durch eine Sammlung ist in erster Linie keine threadsichere Prozedur. Selbst wenn eine Auflistung synchronisiert wird, können andere Threads die Auflistung weiterhin ändern, wodurch der Enumerator eine Ausnahme auslöst. Um die Threadsicherheit während der Enumeration zu gewährleisten, können Sie die Auflistung entweder während der gesamten Enumeration sperren oder die Ausnahmen erfassen, die sich aus Änderungen ergeben, die von anderen Threads vorgenommen wurden.