KeyedCollection<TKey,TItem>.Dictionary 屬性
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
取得 KeyedCollection<TKey,TItem> 的查閱字典。
protected:
property System::Collections::Generic::IDictionary<TKey, TItem> ^ Dictionary { System::Collections::Generic::IDictionary<TKey, TItem> ^ get(); };
protected System.Collections.Generic.IDictionary<TKey,TItem> Dictionary { get; }
protected System.Collections.Generic.IDictionary<TKey,TItem>? Dictionary { get; }
member this.Dictionary : System.Collections.Generic.IDictionary<'Key, 'Item>
Protected ReadOnly Property Dictionary As IDictionary(Of TKey, TItem)
屬性值
KeyedCollection<TKey,TItem> 的查閱字典,如果有的話,否則為 null
。
範例
下列程式代碼範例示範如何覆寫受保護的 ChangeItemKey 方法來支援可變密鑰,以及如何覆寫受保護的 InsertItem、 RemoveItem、 ClearItems和 SetItem 方法來維護密鑰和集合的完整性。
程序代碼範例會 MutableKeys
建立衍生自 KeyedCollection<TKey,TItem>和類別的 MutableKey
集合。 類別 MutableKey
具有可 Key
設定的屬性。 將新的索引鍵指派給 屬性時,屬性 setter 會呼叫internal
集合的 Visual Basic) ChangeKey
方法中的 (Friend
,以測試新索引鍵是否與現有的索引鍵衝突。 如果是,則會擲回例外狀況,而且屬性值不會變更。
為了維護 物件與集合之間的MutableKey
連接,以及防止物件插入兩個internal
集合中,類別MutableKey
在 Visual Basic) 字段中具有 (Friend
Collection
。MutableKeys
此欄位是由受保護的方法所維護,這些方法會提供自定義行為,以新增和移除集合中的專案,例如 InsertItem 方法。 當專案新增至集合,並在移除專案時清除時,就會設定欄位。
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
// This class demonstrates one way to use the ChangeItemKey
// method to store objects with keys that can be changed. The
// ChangeItemKey method is used to keep the internal lookup
// Dictionary in sync with the keys of the stored objects.
//
// MutableKeys stores MutableKey objects, which have an Integer
// Key property that can be set. Therefore, MutableKeys inherits
// KeyedCollection(Of Integer, MutableKey).
//
public class MutableKeys : KeyedCollection<int, MutableKey>
{
// This parameterless constructor delegates to the base class
// constructor that specifies a dictionary threshold. A
// threshold of 0 means the internal Dictionary is created
// the first time an object is added.
//
public MutableKeys() : base(null, 0) {}
protected override int GetKeyForItem(MutableKey item)
{
// The key is MutableKey.Key.
return item.Key;
}
protected override void InsertItem(int index, MutableKey newItem)
{
if (newItem.Collection != null)
throw new ArgumentException("The item already belongs to a collection.");
base.InsertItem(index, newItem);
newItem.Collection = this;
}
protected override void SetItem(int index, MutableKey newItem)
{
MutableKey replaced = Items[index];
if (newItem.Collection != null)
throw new ArgumentException("The item already belongs to a collection.");
base.SetItem(index, newItem);
newItem.Collection = this;
replaced.Collection = null;
}
protected override void RemoveItem(int index)
{
MutableKey removedItem = Items[index];
base.RemoveItem(index);
removedItem.Collection = null;
}
protected override void ClearItems()
{
foreach( MutableKey mk in Items )
{
mk.Collection = null;
}
base.ClearItems();
}
internal void ChangeKey(MutableKey item, int newKey)
{
base.ChangeItemKey(item, newKey);
}
public void Dump()
{
Console.WriteLine("\nDUMP:");
if (Dictionary == null)
{
Console.WriteLine(" The dictionary has not been created.");
}
else
{
Console.WriteLine(" Dictionary entries");
Console.WriteLine(" ------------------");
foreach( KeyValuePair<int, MutableKey> kvp in Dictionary )
{
Console.WriteLine(" {0} : {1}", kvp.Key, kvp.Value);
}
}
Console.WriteLine("\n List of items");
Console.WriteLine(" -------------");
foreach( MutableKey mk in Items )
{
Console.WriteLine(" {0}", mk);
}
}
}
public class Demo
{
public static void Main()
{
MutableKeys mkeys = new MutableKeys();
// The Add method is inherited from Collection.
//
mkeys.Add(new MutableKey(110072674, "Widget"));
mkeys.Add(new MutableKey(110072675, "Sprocket"));
mkeys.Dump();
Console.WriteLine("\nCreate and insert a new item:");
MutableKey test = new MutableKey(110072684, "Gear");
mkeys.Insert(1, test);
mkeys.Dump();
try
{
Console.WriteLine("\nTry to insert the item again:");
mkeys.Insert(1, test);
}
catch(ArgumentException ex)
{
Console.WriteLine("Error: {0}", ex.Message);
}
Console.WriteLine("\nChange the Key property of the item:");
test.Key = 100000072;
mkeys.Dump();
try
{
Console.WriteLine("\nTry to set the Key property to an existing key:");
test.Key = 110072674;
}
catch(ArgumentException ex)
{
Console.WriteLine("Error: {0}", ex.Message);
}
mkeys.Dump();
}
private static void Display(MutableKeys order)
{
Console.WriteLine();
foreach( MutableKey item in order )
{
Console.WriteLine(item);
}
}
}
// This class has a key that can be changed.
//
public class MutableKey
{
public MutableKey(int newKey, string newValue)
{
_key = newKey;
Value = newValue;
} //New
public string Value;
internal MutableKeys Collection;
private int _key;
public int Key
{
get
{
return _key;
}
set
{
if (Collection != null)
{
Collection.ChangeKey(this, value);
}
_key = value;
}
}
public override string ToString()
{
return String.Format("{0,9} {1}", _key, Value);
}
}
/* This code example produces the following output:
DUMP:
Dictionary entries
------------------
110072674 : 110072674 Widget
110072675 : 110072675 Sprocket
List of items
-------------
110072674 Widget
110072675 Sprocket
Create and insert a new item:
DUMP:
Dictionary entries
------------------
110072674 : 110072674 Widget
110072675 : 110072675 Sprocket
110072684 : 110072684 Gear
List of items
-------------
110072674 Widget
110072684 Gear
110072675 Sprocket
Try to insert the item again:
Error: The item already belongs to a collection.
Change the Key property of the item:
DUMP:
Dictionary entries
------------------
110072674 : 110072674 Widget
110072675 : 110072675 Sprocket
100000072 : 100000072 Gear
List of items
-------------
110072674 Widget
100000072 Gear
110072675 Sprocket
Try to set the Key property to an existing key:
Error: An item with the same key has already been added.
DUMP:
Dictionary entries
------------------
110072674 : 110072674 Widget
110072675 : 110072675 Sprocket
100000072 : 100000072 Gear
List of items
-------------
110072674 Widget
100000072 Gear
110072675 Sprocket
*/
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
' This class demonstrates one way to use the ChangeItemKey
' method to store objects with keys that can be changed. The
' ChangeItemKey method is used to keep the internal lookup
' Dictionary in sync with the keys of the stored objects.
'
' MutableKeys stores MutableKey objects, which have an Integer
' Key property that can be set. Therefore, MutableKeys inherits
' KeyedCollection(Of Integer, MutableKey).
'
Public Class MutableKeys
Inherits KeyedCollection(Of Integer, MutableKey)
' This parameterless constructor delegates to the base class
' constructor that specifies a dictionary threshold. A
' threshold of 0 means the internal Dictionary is created
' the first time an object is added.
'
Public Sub New()
MyBase.New(Nothing, 0)
End Sub
Protected Overrides Function GetKeyForItem( _
ByVal item As MutableKey) As Integer
' The key is MutableKey.Key.
Return item.Key
End Function
Protected Overrides Sub InsertItem( _
ByVal index As Integer, ByVal newItem As MutableKey)
If newItem.Collection IsNot Nothing Then _
Throw New ArgumentException("The item already belongs to a collection.")
MyBase.InsertItem(index, newItem)
newItem.Collection = Me
End Sub
Protected Overrides Sub SetItem(ByVal index As Integer, _
ByVal newItem As MutableKey)
Dim replaced As MutableKey = Items(index)
If newItem.Collection IsNot Nothing Then _
Throw New ArgumentException("The item already belongs to a collection.")
MyBase.SetItem(index, newItem)
newItem.Collection = Me
replaced.Collection = Nothing
End Sub
Protected Overrides Sub RemoveItem(ByVal index As Integer)
Dim removedItem As MutableKey = Items(index)
MyBase.RemoveItem(index)
removedItem.Collection = Nothing
End Sub
Protected Overrides Sub ClearItems()
For Each mk As MutableKey In Items
mk.Collection = Nothing
Next
MyBase.ClearItems()
End Sub
Friend Sub ChangeKey(ByVal item As MutableKey, _
ByVal newKey As Integer)
MyBase.ChangeItemKey(item, newKey)
End Sub
Public Sub Dump()
Console.WriteLine(vbLf & "DUMP:")
If Dictionary Is Nothing Then
Console.WriteLine(" The dictionary has not been created.")
Else
Console.WriteLine(" Dictionary entries")
Console.WriteLine(" ------------------")
For Each kvp As KeyValuePair(Of Integer, MutableKey) In Dictionary
Console.WriteLine(" {0} : {1}", kvp.Key, kvp.Value)
Next
End If
Console.WriteLine(vbLf & " List of items")
Console.WriteLine(" -------------")
For Each mk As MutableKey In Items
Console.WriteLine(" {0}", mk)
Next
End Sub
End Class
Public Class Demo
Public Shared Sub Main()
Dim mkeys As New MutableKeys()
' The Add method is inherited from Collection.
'
mkeys.Add(New MutableKey(110072674, "Widget"))
mkeys.Add(New MutableKey(110072675, "Sprocket"))
mkeys.Dump()
Console.WriteLine(vbLf & "Create and insert a new item:")
Dim test As New MutableKey(110072684, "Gear")
mkeys.Insert(1, test)
mkeys.Dump()
Try
Console.WriteLine(vbLf & "Try to insert the item again:")
mkeys.Insert(1, test)
Catch ex As ArgumentException
Console.WriteLine("Error: {0}", ex.Message)
End Try
Console.WriteLine(vbLf & "Change the Key property of the item:")
test.Key = 100000072
mkeys.Dump()
Try
Console.WriteLine(vbLf & "Try to set the Key property to an existing key:")
test.Key = 110072674
Catch ex As ArgumentException
Console.WriteLine("Error: {0}", ex.Message)
End Try
mkeys.Dump()
End Sub
Private Shared Sub Display(ByVal order As MutableKeys)
Console.WriteLine()
For Each item As MutableKey In order
Console.WriteLine(item)
Next item
End Sub
End Class
' This class has a key that can be changed.
'
Public Class MutableKey
Public Sub New(ByVal newKey As Integer, ByVal newValue As String)
_key = newKey
Value = newValue
End Sub
Public Value As String
Friend Collection As MutableKeys
Private _key As Integer
Public Property Key As Integer
Get
Return _key
End Get
Set
If Collection IsNot Nothing Then
Collection.ChangeKey(Me, value)
End If
_key = value
End Set
End Property
Public Overrides Function ToString() As String
Return String.Format("{0,9} {1}", _key, Value)
End Function
End Class
' This code example produces the following output:
'
'DUMP:
' Dictionary entries
' ------------------
' 110072674 : 110072674 Widget
' 110072675 : 110072675 Sprocket
'
' List of items
' -------------
' 110072674 Widget
' 110072675 Sprocket
'
'Create and insert a new item:
'
'DUMP:
' Dictionary entries
' ------------------
' 110072674 : 110072674 Widget
' 110072675 : 110072675 Sprocket
' 110072684 : 110072684 Gear
'
' List of items
' -------------
' 110072674 Widget
' 110072684 Gear
' 110072675 Sprocket
'
'Try to insert the item again:
'Error: The item already belongs to a collection.
'
'Change the Key property of the item:
'
'DUMP:
' Dictionary entries
' ------------------
' 110072674 : 110072674 Widget
' 110072675 : 110072675 Sprocket
' 100000072 : 100000072 Gear
'
' List of items
' -------------
' 110072674 Widget
' 100000072 Gear
' 110072675 Sprocket
'
'Try to set the Key property to an existing key:
'Error: An item with the same key has already been added.
'
'DUMP:
' Dictionary entries
' ------------------
' 110072674 : 110072674 Widget
' 110072675 : 110072675 Sprocket
' 100000072 : 100000072 Gear
'
' List of items
' -------------
' 110072674 Widget
' 100000072 Gear
' 110072675 Sprocket
備註
根據預設,會 KeyedCollection<TKey,TItem> 包含加入第一個專案時所建立的查閱字典。 當專案新增至 KeyedCollection<TKey,TItem>時,專案的索引鍵會擷取一次,並儲存在查閱字典中,以加快搜尋速度。 您可以使用建 KeyedCollection<TKey,TItem>(IEqualityComparer<TKey>, Int32) 構函式並指定字典建立閾值來覆寫此行為。
擷取這個屬性的值是一種 O(1) 運算。