KeyedCollection.ChangeItemKey メソッド
アセンブリ: mscorlib (mscorlib.dll 内)



このメソッドは item に埋め込まれたキーは変更せず、単に検索ディクショナリに保存されたキーを置き換えます。したがって、newKey が item に埋め込まれたキーと異なる場合は、GetKeyForItem で返されるキーを使用して item にアクセスすることはできません。
KeyedCollection が検索ディクショナリを持たない場合、このメソッドは何も実行しません。
KeyedCollection 内のすべてのキーは一意である必要があります。キーには null 参照 (Visual Basic では Nothing) は使用できません。
実装についてのメモ項目に埋め込まれたキーを変更した後、このメソッドを呼び出して検索ディクショナリのキーを更新する必要があります。ディクショナリ作成のしきい値が –1 の場合は、このメソッドを呼び出す必要はありません。
ChangeItemKey メソッドを、派生クラスのパブリック メソッドとして公開しないでください。このメソッドを不正に使用すると、検索ディクショナリが項目キーと同期されなくなります。たとえば、キーを null 参照 (Visual Basic では Nothing) に設定してから、そのキーを別の値に設定すると、特定の項目に対して複数のキーが検索ディクショナリに追加されます。このメソッドを内部的に公開して項目キーを変更可能にします。特定の項目のキーが変更になる場合は、このメソッドを使用して検索ディクショナリのキーを変更します。

このコード例では、ChangeItemKey プロテクト メソッドをオーバーライドして変更可能なキーをサポートする方法、および InsertItem、RemoveItem、ClearItems、および SetItem の各プロテクト メソッドをオーバーライドしてキーとコレクションの整合性を維持する方法を示します。
KeyedCollection クラスおよび MutableKey クラスから派生した MutableKeys コレクションを作成します。MutableKey クラスには、設定可能な Key プロパティが含まれています。新しいキーをプロパティに割り当てると、プロパティ Set アクセス操作子はコレクションの internal (Visual Basic の場合は Friend) ChangeKey メソッドを呼び出して、新しいキーが既存のキーと競合するかどうかをテストします。競合する場合は例外がスローされ、プロパティ値は変更されません。
MutableKey オブジェクトと MutableKeys コレクションの接続を維持するために、また、オブジェクトが 2 つのコレクションの間に挿入されないようにするために、MutableKey クラスには internal (Visual Basic の場合は Friend) Collection フィールドがあります。このフィールドは、InsertItem メソッドなど、コレクションの項目の追加および削除のためのカスタム動作を提供するプロテクト メソッドによって維持されます。このフィールドは、項目がコレクションに追加されるときに設定され、項目が削除されるときにクリアされます。
Imports System 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 'New 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
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 */

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


KeyedCollection ジェネリック クラス
KeyedCollection メンバ
System.Collections.ObjectModel 名前空間
GetKeyForItem
Item
Weblioに収録されているすべての辞書からKeyedCollection.ChangeItemKey メソッドを検索する場合は、下記のリンクをクリックしてください。

- KeyedCollection.ChangeItemKey メソッドのページへのリンク