KeyedCollection<TKey,TItem>.ChangeItemKey(TItem, TKey) Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Ändrar nyckeln som är associerad med det angivna elementet i uppslagsordlistan.
protected:
void ChangeItemKey(TItem item, TKey newKey);
protected void ChangeItemKey(TItem item, TKey newKey);
member this.ChangeItemKey : 'Item * 'Key -> unit
Protected Sub ChangeItemKey (item As TItem, newKey As TKey)
Parametrar
- item
- TItem
Elementet som du vill ändra nyckeln till.
- newKey
- TKey
Den nya nyckeln för item.
Undantag
Exempel
I följande kodexempel visas hur du åsidosätter den skyddade ChangeItemKey metoden för att stödja föränderliga nycklar och hur du åsidosätter de skyddade InsertItemmetoderna , RemoveItem, ClearItemsoch SetItem för att upprätthålla integriteten för nycklarna och samlingen.
Kodexemplet skapar MutableKeys samlingen, som härleds från KeyedCollection<TKey,TItem>och MutableKey klassen. Klassen MutableKey har en inställningsbar Key egenskap. När en ny nyckel tilldelas egenskapen anropar egenskapsuppsättningen internalChangeKey metoden för samlingen för att testa om den nya nyckeln skulle vara i konflikt med en befintlig nyckel. I så fall genereras ett undantag och egenskapsvärdet ändras inte.
För att upprätthålla anslutningen mellan ett MutableKey objekt och MutableKeys samlingen och förhindra att ett objekt infogas i två samlingar har MutableKey klassen ett internalCollection fält. Det här fältet underhålls av de skyddade metoder som tillhandahåller anpassat beteende för att lägga till och ta bort objekt från samlingen, till exempel InsertItem metoden. Fältet anges när objektet läggs till i en samling och rensas när objektet tas bort.
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
Kommentarer
Mer information om det här API:et finns i Kompletterande API-kommentarer för KeyedCollection<TKey, TItem>. ChangeItemKey.