KeyedCollection コンストラクタ ()
アセンブリ: mscorlib (mscorlib.dll 内)


このコンストラクタで作成された KeyedCollection は、EqualityComparer.Default から取得する、キーの型の既定のジェネリック等値比較演算子を使用します。異なるジェネリック等値比較演算子を指定するには、KeyedCollection(ジェネリック IEqualityComparer) コンストラクタまたは KeyedCollection(ジェネリック IEqualityComparer,Int32) コンストラクタを使用します。
既定では、KeyedCollection には最初の項目の追加時に作成される検索ディクショナリが含まれます。高速な検索を可能にするため、KeyedCollection に項目が追加されると、項目のキーが 1 度だけ抽出され、検索ディクショナリに保存されます。この動作は、KeyedCollection(ジェネリック IEqualityComparer,Int32) コンストラクタを使用し、ディクショナリ作成のしきい値を指定することによりオーバーライドできます。
![]() |
---|
KeyedCollection クラスは抽象クラス (Visual Basic の場合は MustInherit) なので、使用するためにはこのクラスから派生させる必要があります。派生型のコンストラクタで、適切な KeyedCollection コンストラクタを呼び出します。コンストラクタ内の等値比較演算子やディクショナリ作成のしきい値のように機能を公開する必要はありません。 |

このコード例は、KeyedCollection からコレクション クラスを派生させるために必要な最小限のコードを示しています。GetKeyForItem メソッドをオーバーライドし、基本クラス コンストラクタに処理を代行させるパブリック コンストラクタを用意しています。また、KeyedCollection クラスおよび Collection クラスから継承されたプロパティおよびメソッドも多数示しています。
SimpleOrder クラスは、OrderItem オブジェクトを含んでいる非常に単純な発注リストです。各オブジェクトは行項目を順番に表します。OrderItem のキーは変更できません。これは、KeyedCollection の派生クラスを使用する際に考慮する必要がある重要な事項です。変更可能なキーを使用するコード例の詳細については、ChangeItemKey のトピックを参照してください。
Imports System Imports System.Collections.Generic Imports System.Collections.ObjectModel ' This class represents a very simple keyed list of OrderItems, ' inheriting most of its behavior from the KeyedCollection and ' Collection classes. The immediate base class is the constructed ' type KeyedCollection(Of Integer, OrderItem). When you inherit ' from KeyedCollection, the second generic type argument is the ' type that you want to store in the collection -- in this case ' OrderItem. The first generic argument is the type that you want ' to use as a key. Its values must be calculated from OrderItem; ' in this case it is the Integer field PartNumber, so SimpleOrder ' inherits KeyedCollection(Of Integer, OrderItem). ' Public Class SimpleOrder Inherits KeyedCollection(Of Integer, OrderItem) ' The parameterless constructor of the base class creates a ' KeyedCollection with an internal dictionary. For this code ' example, no other constructors are exposed. ' Public Sub New() MyBase.New() End Sub ' This is the only method that absolutely must be overridden, ' because without it the KeyedCollection cannot extract the ' keys from the items. The input parameter type is the ' second generic type argument, in this case OrderItem, and ' the return value type is the first generic type argument, ' in this case Integer. ' Protected Overrides Function GetKeyForItem( _ ByVal item As OrderItem) As Integer ' In this example, the key is the part number. Return item.PartNumber End Function End Class Public Class Demo Public Shared Sub Main() Dim weekly As New SimpleOrder() ' The Add method, inherited from Collection, takes OrderItem. ' weekly.Add(New OrderItem(110072674, "Widget", 400, 45.17)) weekly.Add(New OrderItem(110072675, "Sprocket", 27, 5.3)) weekly.Add(New OrderItem(101030411, "Motor", 10, 237.5)) weekly.Add(New OrderItem(110072684, "Gear", 175, 5.17)) Display(weekly) ' The Contains method of KeyedCollection takes TKey. ' Console.WriteLine(vbLf & "Contains(101030411): {0}", _ weekly.Contains(101030411)) ' The default Item property of KeyedCollection takes the key ' type, Integer. ' Console.WriteLine(vbLf & "weekly(101030411).Description: {0}", _ weekly(101030411).Description) ' The Remove method of KeyedCollection takes a key. ' Console.WriteLine(vbLf & "Remove(101030411)") weekly.Remove(101030411) Display(weekly) ' The Insert method, inherited from Collection, takes an ' index and an OrderItem. ' Console.WriteLine(vbLf & "Insert(2, New OrderItem(...))") weekly.Insert(2, New OrderItem(111033401, "Nut", 10, .5)) Display(weekly) ' The default Item property is overloaded. One overload comes ' from KeyedCollection(Of Integer, OrderItem); that overload ' is read-only, and takes Integer because it retrieves by key. ' The other overload comes from Collection(Of OrderItem), the ' base class of KeyedCollection(Of Integer, OrderItem); it ' retrieves by index, so it also takes an Integer. The compiler ' uses the most-derived overload, from KeyedCollection, so the ' only way to access SimpleOrder by index is to cast it to ' Collection(Of OrderItem). Otherwise the index is interpreted ' as a key, and KeyNotFoundException is thrown. ' Dim coweekly As Collection(Of OrderItem) = weekly Console.WriteLine(vbLf & "coweekly(2).Description: {0}", _ coweekly(2).Description) Console.WriteLine(vbLf & "coweekly(2) = New OrderItem(...)") coweekly(2) = New OrderItem(127700026, "Crank", 27, 5.98) Dim temp As OrderItem = coweekly(2) ' The IndexOf method, inherited from Collection(Of OrderItem), ' takes an OrderItem instead of a key. ' Console.WriteLine(vbLf & "IndexOf(temp): {0}", _ weekly.IndexOf(temp)) ' The inherited Remove method also takes an OrderItem. ' Console.WriteLine(vbLf & "Remove(temp)") weekly.Remove(temp) Display(weekly) Console.WriteLine(vbLf & "RemoveAt(0)") weekly.RemoveAt(0) Display(weekly) End Sub Private Shared Sub Display(ByVal order As SimpleOrder) Console.WriteLine() For Each item As OrderItem In order Console.WriteLine(item) Next item End Sub End Class ' This class represents a simple line item in an order. All the ' values are immutable except quantity. ' Public Class OrderItem Public ReadOnly PartNumber As Integer Public ReadOnly Description As String Public ReadOnly UnitPrice As Double Private _quantity As Integer = 0 Public Sub New(ByVal partNumber As Integer, _ ByVal description As String, _ ByVal quantity As Integer, _ ByVal unitPrice As Double) Me.PartNumber = partNumber Me.Description = description Me.Quantity = quantity Me.UnitPrice = unitPrice End Sub 'New Public Property Quantity() As Integer Get Return _quantity End Get Set If value < 0 Then Throw New ArgumentException("Quantity cannot be negative.") End If _quantity = value End Set End Property Public Overrides Function ToString() As String Return String.Format( _ "{0,9} {1,6} {2,-12} at {3,8:#,###.00} = {4,10:###,###.00}", _ PartNumber, _quantity, Description, UnitPrice, _ UnitPrice * _quantity) End Function End Class ' This code example produces the following output: ' '110072674 400 Widget at 45.17 = 18,068.00 '110072675 27 Sprocket at 5.30 = 143.10 '101030411 10 Motor at 237.50 = 2,375.00 '110072684 175 Gear at 5.17 = 904.75 ' 'Contains(101030411): True ' 'weekly(101030411).Description: Motor ' 'Remove(101030411) ' '110072674 400 Widget at 45.17 = 18,068.00 '110072675 27 Sprocket at 5.30 = 143.10 '110072684 175 Gear at 5.17 = 904.75 ' 'Insert(2, New OrderItem(...)) ' '110072674 400 Widget at 45.17 = 18,068.00 '110072675 27 Sprocket at 5.30 = 143.10 '111033401 10 Nut at .50 = 5.00 '110072684 175 Gear at 5.17 = 904.75 ' 'coweekly(2).Description: Nut ' 'coweekly(2) = New OrderItem(...) ' 'IndexOf(temp): 2 ' 'Remove(temp) ' '110072674 400 Widget at 45.17 = 18,068.00 '110072675 27 Sprocket at 5.30 = 143.10 '110072684 175 Gear at 5.17 = 904.75 ' 'RemoveAt(0) ' '110072675 27 Sprocket at 5.30 = 143.10 '110072684 175 Gear at 5.17 = 904.75
using System; using System.Collections.Generic; using System.Collections.ObjectModel; // This class represents a very simple keyed list of OrderItems, // inheriting most of its behavior from the KeyedCollection and // Collection classes. The immediate base class is the constructed // type KeyedCollection<int, OrderItem>. When you inherit // from KeyedCollection, the second generic type argument is the // type that you want to store in the collection -- in this case // OrderItem. The first type argument is the type that you want // to use as a key. Its values must be calculated from OrderItem; // in this case it is the int field PartNumber, so SimpleOrder // inherits KeyedCollection<int, OrderItem>. // public class SimpleOrder : KeyedCollection<int, OrderItem> { // The parameterless constructor of the base class creates a // KeyedCollection with an internal dictionary. For this code // example, no other constructors are exposed. // public SimpleOrder() : base() {} // This is the only method that absolutely must be overridden, // because without it the KeyedCollection cannot extract the // keys from the items. The input parameter type is the // second generic type argument, in this case OrderItem, and // the return value type is the first generic type argument, // in this case int. // protected override int GetKeyForItem(OrderItem item) { // In this example, the key is the part number. return item.PartNumber; } } public class Demo { public static void Main() { SimpleOrder weekly = new SimpleOrder(); // The Add method, inherited from Collection, takes OrderItem. // weekly.Add(new OrderItem(110072674, "Widget", 400, 45.17)); weekly.Add(new OrderItem(110072675, "Sprocket", 27, 5.3)); weekly.Add(new OrderItem(101030411, "Motor", 10, 237.5)); weekly.Add(new OrderItem(110072684, "Gear", 175, 5.17)); Display(weekly); // The Contains method of KeyedCollection takes the key, // type, in this case int. // Console.WriteLine("\nContains(101030411): {0}", weekly.Contains(101030411)); // The default Item property of KeyedCollection takes a key. // Console.WriteLine("\nweekly[101030411].Description: {0}", weekly[101030411].Description); // The Remove method of KeyedCollection takes a key. // Console.WriteLine("\nRemove(101030411)"); weekly.Remove(101030411); Display(weekly); // The Insert method, inherited from Collection, takes an // index and an OrderItem. // Console.WriteLine("\nInsert(2, New OrderItem(...))"); weekly.Insert(2, new OrderItem(111033401, "Nut", 10, .5)); Display(weekly); // The default Item property is overloaded. One overload comes // from KeyedCollection<int, OrderItem>; that overload // is read-only, and takes Integer because it retrieves by key. // The other overload comes from Collection<OrderItem>, the // base class of KeyedCollection<int, OrderItem>; it // retrieves by index, so it also takes an Integer. The compiler // uses the most-derived overload, from KeyedCollection, so the // only way to access SimpleOrder by index is to cast it to // Collection<OrderItem>. Otherwise the index is interpreted // as a key, and KeyNotFoundException is thrown. // Collection<OrderItem> coweekly = weekly; Console.WriteLine("\ncoweekly[2].Description: {0}", coweekly[2].Description); Console.WriteLine("\ncoweekly[2] = new OrderItem(...)"); coweekly[2] = new OrderItem(127700026, "Crank", 27, 5.98); OrderItem temp = coweekly[2]; // The IndexOf method inherited from Collection<OrderItem> // takes an OrderItem instead of a key // Console.WriteLine("\nIndexOf(temp): {0}", weekly.IndexOf(temp)); // The inherited Remove method also takes an OrderItem. // Console.WriteLine("\nRemove(temp)"); weekly.Remove(temp); Display(weekly); Console.WriteLine("\nRemoveAt(0)"); weekly.RemoveAt(0); Display(weekly); } private static void Display(SimpleOrder order) { Console.WriteLine(); foreach( OrderItem item in order ) { Console.WriteLine(item); } } } // This class represents a simple line item in an order. All the // values are immutable except quantity. // public class OrderItem { public readonly int PartNumber; public readonly string Description; public readonly double UnitPrice; private int _quantity = 0; public OrderItem(int partNumber, string description, int quantity, double unitPrice) { this.PartNumber = partNumber; this.Description = description; this.Quantity = quantity; this.UnitPrice = unitPrice; } public int Quantity { get { return _quantity; } set { if (value<0) throw new ArgumentException("Quantity cannot be negative."); _quantity = value; } } public override string ToString() { return String.Format( "{0,9} {1,6} {2,-12} at {3,8:#,###.00} = {4,10:###,###.00}", PartNumber, _quantity, Description, UnitPrice, UnitPrice * _quantity); } } /* This code example produces the following output: 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 101030411 10 Motor at 237.50 = 2,375.00 110072684 175 Gear at 5.17 = 904.75 Contains(101030411): True weekly[101030411].Description: Motor Remove(101030411) 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 110072684 175 Gear at 5.17 = 904.75 Insert(2, New OrderItem(...)) 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 111033401 10 Nut at .50 = 5.00 110072684 175 Gear at 5.17 = 904.75 coweekly[2].Description: Nut coweekly[2] = new OrderItem(...) IndexOf(temp): 2 Remove(temp) 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 110072684 175 Gear at 5.17 = 904.75 RemoveAt(0) 110072675 27 Sprocket at 5.30 = 143.10 110072684 175 Gear at 5.17 = 904.75 */
using namespace System; using namespace System::Collections::Generic; using namespace System::Collections::ObjectModel; // This class represents a simple line item in an order. All the // values are immutable except quantity. // public ref class OrderItem { private: int _quantity; public: initonly int PartNumber; initonly String^ Description; initonly double UnitPrice; OrderItem(int partNumber, String^ description, int quantity, double unitPrice) { this->PartNumber = partNumber; this->Description = description; this->Quantity = quantity; this->UnitPrice = unitPrice; } property int Quantity { int get() { return _quantity; } void set(int value) { if (value < 0) throw gcnew ArgumentException("Quantity cannot be negative."); _quantity = value; } } virtual String^ ToString() override { return String::Format( "{0,9} {1,6} {2,-12} at {3,8:#,###.00} = {4,10:###,###.00}", PartNumber, _quantity, Description, UnitPrice, UnitPrice * _quantity); } }; // This class represents a very simple keyed list of OrderItems, // inheriting most of its behavior from the KeyedCollection and // Collection classes. The immediate base class is the constructed // type KeyedCollection<int, OrderItem>. When you inherit // from KeyedCollection, the second generic type argument is the // type that you want to store in the collection -- in this case // OrderItem. The first type argument is the type that you want // to use as a key. Its values must be calculated from OrderItem; // in this case it is the int field PartNumber, so SimpleOrder // inherits KeyedCollection<int, OrderItem>. // public ref class SimpleOrder : KeyedCollection<int, OrderItem^> { // The parameterless constructor of the base class creates a // KeyedCollection with an internal dictionary. For this code // example, no other constructors are exposed. // public: SimpleOrder() {} // This is the only method that absolutely must be overridden, // because without it the KeyedCollection cannot extract the // keys from the items. The input parameter type is the // second generic type argument, in this case OrderItem, and // the return value type is the first generic type argument, // in this case int. // protected: virtual int GetKeyForItem(OrderItem^ item) override { // In this example, the key is the part number. return item->PartNumber; } }; public ref class Demo { public: static void Main() { SimpleOrder^ weekly = gcnew SimpleOrder(); // The Add method, inherited from Collection, takes OrderItem. // weekly->Add(gcnew OrderItem(110072674, "Widget", 400, 45.17)); weekly->Add(gcnew OrderItem(110072675, "Sprocket", 27, 5.3)); weekly->Add(gcnew OrderItem(101030411, "Motor", 10, 237.5)); weekly->Add(gcnew OrderItem(110072684, "Gear", 175, 5.17)); Display(weekly); // The Contains method of KeyedCollection takes the key, // type, in this case int. // Console::WriteLine("\nContains(101030411): {0}", weekly->Contains(101030411)); // The default Item property of KeyedCollection takes a key. // Console::WriteLine("\nweekly(101030411)->Description: {0}", weekly[101030411]->Description); // The Remove method of KeyedCollection takes a key. // Console::WriteLine("\nRemove(101030411)"); weekly->Remove(101030411); Display(weekly); // The Insert method, inherited from Collection, takes an // index and an OrderItem. // Console::WriteLine("\nInsert(2, New OrderItem(...))"); weekly->Insert(2, gcnew OrderItem(111033401, "Nut", 10, .5)); Display(weekly); // The default Item property is overloaded. One overload comes // from KeyedCollection<int, OrderItem>; that overload // is read-only, and takes Integer because it retrieves by key. // The other overload comes from Collection<OrderItem>, the // base class of KeyedCollection<int, OrderItem>; it // retrieves by index, so it also takes an Integer. The compiler // uses the most-derived overload, from KeyedCollection, so the // only way to access SimpleOrder by index is to cast it to // Collection<OrderItem>. Otherwise the index is interpreted // as a key, and KeyNotFoundException is thrown. // Collection<OrderItem^>^ coweekly = weekly; Console::WriteLine("\ncoweekly[2].Description: {0}", coweekly[2]->Description); Console::WriteLine("\ncoweekly[2] = gcnew OrderItem(...)"); coweekly[2] = gcnew OrderItem(127700026, "Crank", 27, 5.98); OrderItem^ temp = coweekly[2]; // The IndexOf method inherited from Collection<OrderItem> // takes an OrderItem instead of a key // Console::WriteLine("\nIndexOf(temp): {0}", weekly->IndexOf(temp)); // The inherited Remove method also takes an OrderItem. // Console::WriteLine("\nRemove(temp)"); weekly->Remove(temp); Display(weekly); Console::WriteLine("\nRemoveAt(0)"); weekly->RemoveAt(0); Display(weekly); } private: static void Display(SimpleOrder^ order) { Console::WriteLine(); for each( OrderItem^ item in order ) { Console::WriteLine(item); } } }; void main() { Demo::Main(); } /* This code example produces the following output: 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 101030411 10 Motor at 237.50 = 2,375.00 110072684 175 Gear at 5.17 = 904.75 Contains(101030411): True weekly(101030411)->Description: Motor Remove(101030411) 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 110072684 175 Gear at 5.17 = 904.75 Insert(2, New OrderItem(...)) 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 111033401 10 Nut at .50 = 5.00 110072684 175 Gear at 5.17 = 904.75 coweekly(2)->Description: Nut coweekly[2] = gcnew OrderItem(...) IndexOf(temp): 2 Remove(temp) 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 110072684 175 Gear at 5.17 = 904.75 RemoveAt(0) 110072675 27 Sprocket at 5.30 = 143.10 110072684 175 Gear at 5.17 = 904.75 */

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 名前空間
IEqualityComparer ジェネリック インターフェイス
KeyedCollection コンストラクタ

名前 | 説明 |
---|---|
KeyedCollection () | 既定の等値比較演算子を使用する KeyedCollection クラスの新しいインスタンスを初期化します。 .NET Compact Framework によってサポートされています。 |
KeyedCollection (ジェネリック IEqualityComparer) | 指定した等値比較演算子を使用する KeyedCollection クラスの新しいインスタンスを初期化します。 .NET Compact Framework によってサポートされています。 |
KeyedCollection (ジェネリック IEqualityComparer, Int32) | 指定した等値比較演算子を使用し、指定したしきい値を超えた場合に検索ディクショナリを作成する、KeyedCollection クラスの新しいインスタンスを初期化します。 .NET Compact Framework によってサポートされています。 |

関連項目
KeyedCollection ジェネリック クラスKeyedCollection メンバ
System.Collections.ObjectModel 名前空間
IEqualityComparer ジェネリック インターフェイス
KeyedCollection コンストラクタ (ジェネリック IEqualityComparer)
アセンブリ: mscorlib (mscorlib.dll 内)

Dim comparer As IEqualityComparer(Of TKey) Dim instance As New KeyedCollection(Of TKey, TItem)(comparer)

既定では、KeyedCollection には最初の項目の追加時に作成される検索ディクショナリが含まれます。高速な検索を可能にするため、KeyedCollection に項目が追加されると、項目のキーが 1 度だけ抽出され、検索ディクショナリに保存されます。この動作は、KeyedCollection(ジェネリック IEqualityComparer,Int32) コンストラクタを使用し、ディクショナリ作成のしきい値を指定することによりオーバーライドできます。
![]() |
---|
KeyedCollection クラスは抽象クラス (Visual Basic の場合は MustInherit) なので、使用するためにはこのクラスから派生させる必要があります。派生型のコンストラクタで、適切な KeyedCollection コンストラクタを呼び出します。コンストラクタ内の等値比較演算子やディクショナリ作成のしきい値のように機能を公開する必要はありません。 |

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 名前空間
IEqualityComparer ジェネリック インターフェイス
KeyedCollection コンストラクタ (ジェネリック IEqualityComparer, Int32)
アセンブリ: mscorlib (mscorlib.dll 内)

Protected Sub New ( _ comparer As IEqualityComparer(Of TKey), _ dictionaryCreationThreshold As Integer _ )
Dim comparer As IEqualityComparer(Of TKey) Dim dictionaryCreationThreshold As Integer Dim instance As New KeyedCollection(Of TKey, TItem)(comparer, dictionaryCreationThreshold)
protected function KeyedCollection ( comparer : IEqualityComparer<TKey>, dictionaryCreationThreshold : int )


既定では、KeyedCollection には最初の項目の追加時に作成される検索ディクショナリが含まれます。高速な検索を可能にするため、KeyedCollection に項目が追加されると、項目のキーが 1 度だけ抽出され、検索ディクショナリに保存されます。このコンストラクタでは動作をオーバーライドできます。0 を指定すると、最初の要素の追加時にディクショナリが作成され、1 を指定すると 2 番目の要素の追加時にディクショナリが作成されます。以降も同様です。しきい値として –1 を指定した場合、検索ディクショナリは作成されません。
非常に小さいコレクションの場合、検索ディクショナリによって実現する検索速度の向上効果が、ディクショナリによる必要メモリ量の増加に見合わない可能性があります。しきい値を設定することにより、このトレードオフについて判断を切り替える境界を決定できます。
![]() |
---|
KeyedCollection クラスは抽象クラス (Visual Basic の場合は MustInherit) なので、使用するためにはこのクラスから派生させる必要があります。派生型のコンストラクタで、適切な KeyedCollection コンストラクタを呼び出します。コンストラクタ内の等値比較演算子やディクショナリ作成のしきい値のように機能を公開する必要はありません。 |

このコード例では、InsertItem、RemoveItem、ClearItems、および SetItem の各プロテクト メソッドをオーバーライドする方法を示し、Add、Remove、および Clear の各メソッドのカスタム動作と、既定の Item プロパティ (C# の場合はインデクサ) を設定するためのカスタム動作を提供します。この例で提供されるカスタム動作は、Changed という名前の通知イベントです。これは、オーバーライドされた各メソッドの最後で発生します。
このコード例では、しきい値を 0 に設定して KeyedCollection(ジェネリック IEqualityComparer,Int32) コンストラクタを使用するため、オブジェクトがコレクションに最初に追加されたときに内部ディクショナリが作成されます。
このコード例では、SimpleOrder クラスを作成します。このクラスは、KeyedCollection から派生し、単純な注文フォームを表しています。この注文フォームには、注文する項目を表す OrderItem オブジェクトが含まれています。また、イベント情報や、変更の種類を識別する列挙を含めるために、SimpleOrderChangedEventArgs クラスも作成します。
Demo クラスの Main メソッドで、派生クラスのプロパティおよびメソッドを呼び出すことにより、カスタム動作の例を示します。
このコード例では、変更できないキーを持つオブジェクトを使用します。変更可能なキーを使用するコード例の詳細については、ChangeItemKey のトピックを参照してください。
Imports System Imports System.Collections.Generic Imports System.Collections.ObjectModel ' This class derives from KeyedCollection and shows how to override ' the protected ClearItems, InsertItem, RemoveItem, and SetItem ' methods in order to change the behavior of the default Item ' property and the Add, Clear, Insert, and Remove methods. The ' class implements a Changed event, which is raised by all the ' protected methods. ' ' SimpleOrder is a collection of OrderItem objects, and its key ' is the PartNumber field of OrderItem. PartNumber is an Integer, ' so SimpleOrder inherits KeyedCollection(Of Integer, OrderItem). ' (Note that the key of OrderItem cannot be changed; if it could ' be changed, SimpleOrder would have to override ChangeItemKey.) ' Public Class SimpleOrder Inherits KeyedCollection(Of Integer, OrderItem) Public Event Changed As EventHandler(Of SimpleOrderChangedEventArgs) ' This parameterless constructor calls the base class constructor ' that specifies a dictionary threshold of 0, so that the internal ' dictionary is created as soon as an item is added to the ' collection. ' Public Sub New() MyBase.New(Nothing, 0) End Sub ' This is the only method that absolutely must be overridden, ' because without it the KeyedCollection cannot extract the ' keys from the items. ' Protected Overrides Function GetKeyForItem( _ ByVal item As OrderItem) As Integer ' In this example, the key is the part number. Return item.PartNumber End Function Protected Overrides Sub InsertItem( _ ByVal index As Integer, ByVal newItem As OrderItem) MyBase.InsertItem(index, newItem) RaiseEvent Changed(Me, New SimpleOrderChangedEventArgs( _ ChangeType.Added, newItem, Nothing)) End Sub Protected Overrides Sub SetItem(ByVal index As Integer, _ ByVal newItem As OrderItem) Dim replaced As OrderItem = Items(index) MyBase.SetItem(index, newItem) RaiseEvent Changed(Me, New SimpleOrderChangedEventArgs( _ ChangeType.Replaced, replaced, newItem)) End Sub Protected Overrides Sub RemoveItem(ByVal index As Integer) Dim removedItem As OrderItem = Items(index) MyBase.RemoveItem(index) RaiseEvent Changed(Me, New SimpleOrderChangedEventArgs( _ ChangeType.Removed, removedItem, Nothing)) End Sub Protected Overrides Sub ClearItems() MyBase.ClearItems() RaiseEvent Changed(Me, New SimpleOrderChangedEventArgs( _ ChangeType.Cleared, Nothing, Nothing)) End Sub End Class ' Event argument for the Changed event. ' Public Class SimpleOrderChangedEventArgs Inherits EventArgs Private _changedItem As OrderItem Private _changeType As ChangeType Private _replacedWith As OrderItem Public ReadOnly Property ChangedItem As OrderItem Get Return _changedItem End Get End Property Public ReadOnly Property ChangeType As ChangeType Get Return _changeType End Get End Property Public ReadOnly Property ReplacedWith As OrderItem Get Return _replacedWith End Get End Property Public Sub New(ByVal change As ChangeType, ByVal item As OrderItem, _ ByVal replacement As OrderItem) _changeType = change _changedItem = item _replacedWith = replacement End Sub End Class Public Enum ChangeType Added Removed Replaced Cleared End Enum Public Class Demo Public Shared Sub Main() Dim weekly As New SimpleOrder() AddHandler weekly.Changed, AddressOf ChangedHandler ' The Add method, inherited from Collection, takes OrderItem. ' weekly.Add(New OrderItem(110072674, "Widget", 400, 45.17)) weekly.Add(New OrderItem(110072675, "Sprocket", 27, 5.3)) weekly.Add(New OrderItem(101030411, "Motor", 10, 237.5)) weekly.Add(New OrderItem(110072684, "Gear", 175, 5.17)) Display(weekly) ' The Contains method of KeyedCollection takes TKey. ' Console.WriteLine(vbLf & "Contains(101030411): {0}", _ weekly.Contains(101030411)) ' The default Item property of KeyedCollection takes the key ' type, Integer. The property is read-only. ' Console.WriteLine(vbLf & "weekly(101030411).Description: {0}", _ weekly(101030411).Description) ' The Remove method of KeyedCollection takes a key. ' Console.WriteLine(vbLf & "Remove(101030411)") weekly.Remove(101030411) ' The Insert method, inherited from Collection, takes an ' index and an OrderItem. ' Console.WriteLine(vbLf & "Insert(2, New OrderItem(...))") weekly.Insert(2, New OrderItem(111033401, "Nut", 10, .5)) ' The default Item property is overloaded. One overload comes ' from KeyedCollection(Of Integer, OrderItem); that overload ' is read-only, and takes Integer because it retrieves by key. ' The other overload comes from Collection(Of OrderItem), the ' base class of KeyedCollection(Of Integer, OrderItem); it ' retrieves by index, so it also takes an Integer. The compiler ' uses the most-derived overload, from KeyedCollection, so the ' only way to access SimpleOrder by index is to cast it to ' Collection(Of OrderItem). Otherwise the index is interpreted ' as a key, and KeyNotFoundException is thrown. ' Dim coweekly As Collection(Of OrderItem) = weekly Console.WriteLine(vbLf & "coweekly(2).Description: {0}", _ coweekly(2).Description) Console.WriteLine(vbLf & "coweekly(2) = New OrderItem(...)") coweekly(2) = New OrderItem(127700026, "Crank", 27, 5.98) Dim temp As OrderItem = coweekly(2) ' The IndexOf method, inherited from Collection(Of OrderItem), ' takes an OrderItem instead of a key. ' Console.WriteLine(vbLf & "IndexOf(temp): {0}", _ weekly.IndexOf(temp)) ' The inherited Remove method also takes an OrderItem. ' Console.WriteLine(vbLf & "Remove(temp)") weekly.Remove(temp) Console.WriteLine(vbLf & "RemoveAt(0)") weekly.RemoveAt(0) ' Increase the quantity for a line item. Console.WriteLine(vbLf & "coweekly(1) = New OrderItem(...)") coweekly(1) = New OrderItem(coweekly(1).PartNumber, _ coweekly(1).Description, coweekly(1).Quantity + 1000, _ coweekly(1).UnitPrice) Display(weekly) Console.WriteLine() weekly.Clear() End Sub Private Shared Sub Display(ByVal order As SimpleOrder) Console.WriteLine() For Each item As OrderItem In order Console.WriteLine(item) Next item End Sub Private Shared Sub ChangedHandler(ByVal source As Object, _ ByVal e As SimpleOrderChangedEventArgs) Dim item As OrderItem = e.ChangedItem If e.ChangeType = ChangeType.Replaced Then Dim replacement As OrderItem = e.ReplacedWith Console.WriteLine("{0} (quantity {1}) was replaced " & _ "by {2}, (quantity {3}).", item.Description, _ item.Quantity, replacement.Description, replacement.Quantity) ElseIf e.ChangeType = ChangeType.Cleared Then Console.WriteLine("The order list was cleared.") Else Console.WriteLine("{0} (quantity {1}) was {2}.", _ item.Description, item.Quantity, e.ChangeType) End If End Sub End Class ' This class represents a simple line item in an order. All the ' values are immutable except quantity. ' Public Class OrderItem Private _partNumber As Integer Private _description As String Private _unitPrice As Double Private _quantity As Integer Public ReadOnly Property PartNumber As Integer Get Return _partNumber End Get End Property Public ReadOnly Property Description As String Get Return _description End Get End Property Public ReadOnly Property UnitPrice As Double Get Return _unitPrice End Get End Property Public ReadOnly Property Quantity() As Integer Get Return _quantity End Get End Property Public Sub New(ByVal partNumber As Integer, _ ByVal description As String, _ ByVal quantity As Integer, _ ByVal unitPrice As Double) _partNumber = partNumber _description = description _quantity = quantity _unitPrice = unitPrice End Sub 'New Public Overrides Function ToString() As String Return String.Format( _ "{0,9} {1,6} {2,-12} at {3,8:#,###.00} = {4,10:###,###.00}", _ PartNumber, _quantity, Description, UnitPrice, _ UnitPrice * _quantity) End Function End Class ' This code example produces the following output: ' 'Widget (quantity 400) was Added. 'Sprocket (quantity 27) was Added. 'Motor (quantity 10) was Added. 'Gear (quantity 175) was Added. ' '110072674 400 Widget at 45.17 = 18,068.00 '110072675 27 Sprocket at 5.30 = 143.10 '101030411 10 Motor at 237.50 = 2,375.00 '110072684 175 Gear at 5.17 = 904.75 ' 'Contains(101030411): True ' 'weekly(101030411).Description: Motor ' 'Remove(101030411) 'Motor (quantity 10) was Removed. ' 'Insert(2, New OrderItem(...)) 'Nut (quantity 10) was Added. ' 'coweekly(2).Description: Nut ' 'coweekly(2) = New OrderItem(...) 'Nut (quantity 10) was replaced by Crank, (quantity 27). ' 'IndexOf(temp): 2 ' 'Remove(temp) 'Crank (quantity 27) was Removed. ' 'RemoveAt(0) 'Widget (quantity 400) was Removed. ' 'coweekly(1) = New OrderItem(...) 'Gear (quantity 175) was replaced by Gear, (quantity 1175). ' '110072675 27 Sprocket at 5.30 = 143.10 '110072684 1175 Gear at 5.17 = 6,074.75 ' 'The order list was cleared.
using System; using System.Collections.Generic; using System.Collections.ObjectModel; // This class derives from KeyedCollection and shows how to override // the protected ClearItems, InsertItem, RemoveItem, and SetItem // methods in order to change the behavior of the default Item // property and the Add, Clear, Insert, and Remove methods. The // class implements a Changed event, which is raised by all the // protected methods. // // SimpleOrder is a collection of OrderItem objects, and its key // is the PartNumber field of OrderItem. PartNumber is an Integer, // so SimpleOrder inherits KeyedCollection<int, OrderItem>. // (Note that the key of OrderItem cannot be changed; if it could // be changed, SimpleOrder would have to override ChangeItemKey.) // public class SimpleOrder : KeyedCollection<int, OrderItem> { public event EventHandler<SimpleOrderChangedEventArgs> Changed; // This parameterless constructor calls the base class constructor // that specifies a dictionary threshold of 0, so that the internal // dictionary is created as soon as an item is added to the // collection. // public SimpleOrder() : base(null, 0) {} // This is the only method that absolutely must be overridden, // because without it the KeyedCollection cannot extract the // keys from the items. // protected override int GetKeyForItem(OrderItem item) { // In this example, the key is the part number. return item.PartNumber; } protected override void InsertItem(int index, OrderItem newItem) { base.InsertItem(index, newItem); EventHandler<SimpleOrderChangedEventArgs> temp = Changed; if (temp != null) { temp(this, new SimpleOrderChangedEventArgs( ChangeType.Added, newItem, null)); } } protected override void SetItem(int index, OrderItem newItem) { OrderItem replaced = Items[index]; base.SetItem(index, newItem); EventHandler<SimpleOrderChangedEventArgs> temp = Changed; if (temp != null) { temp(this, new SimpleOrderChangedEventArgs( ChangeType.Replaced, replaced, newItem)); } } protected override void RemoveItem(int index) { OrderItem removedItem = Items[index]; base.RemoveItem(index); EventHandler<SimpleOrderChangedEventArgs> temp = Changed; if (temp != null) { temp(this, new SimpleOrderChangedEventArgs( ChangeType.Removed, removedItem, null)); } } protected override void ClearItems() { base.ClearItems(); EventHandler<SimpleOrderChangedEventArgs> temp = Changed; if (temp != null) { temp(this, new SimpleOrderChangedEventArgs( ChangeType.Cleared, null, null)); } } } // Event argument for the Changed event. // public class SimpleOrderChangedEventArgs : EventArgs { private OrderItem _changedItem; private ChangeType _changeType; private OrderItem _replacedWith; public OrderItem ChangedItem { get { return _changedItem; }} public ChangeType ChangeType { get { return _changeType; }} public OrderItem ReplacedWith { get { return _replacedWith; }} public SimpleOrderChangedEventArgs(ChangeType change, OrderItem item, OrderItem replacement) { _changeType = change; _changedItem = item; _replacedWith = replacement; } } public enum ChangeType { Added, Removed, Replaced, Cleared }; public class Demo { public static void Main() { SimpleOrder weekly = new SimpleOrder(); weekly.Changed += new EventHandler<SimpleOrderChangedEventArgs>(ChangedHandler); // The Add method, inherited from Collection, takes OrderItem. // weekly.Add(new OrderItem(110072674, "Widget", 400, 45.17)); weekly.Add(new OrderItem(110072675, "Sprocket", 27, 5.3)); weekly.Add(new OrderItem(101030411, "Motor", 10, 237.5)); weekly.Add(new OrderItem(110072684, "Gear", 175, 5.17)); Display(weekly); // The Contains method of KeyedCollection takes TKey. // Console.WriteLine("\nContains(101030411): {0}", weekly.Contains(101030411)); // The default Item property of KeyedCollection takes the key // type, Integer. The property is read-only. // Console.WriteLine("\nweekly[101030411].Description: {0}", weekly[101030411].Description); // The Remove method of KeyedCollection takes a key. // Console.WriteLine("\nRemove(101030411)"); weekly.Remove(101030411); // The Insert method, inherited from Collection, takes an // index and an OrderItem. // Console.WriteLine("\nInsert(2, new OrderItem(...))"); weekly.Insert(2, new OrderItem(111033401, "Nut", 10, .5)); // The default Item property is overloaded. One overload comes // from KeyedCollection<int, OrderItem>; that overload // is read-only, and takes Integer because it retrieves by key. // The other overload comes from Collection<OrderItem>, the // base class of KeyedCollection<int, OrderItem>; it // retrieves by index, so it also takes an Integer. The compiler // uses the most-derived overload, from KeyedCollection, so the // only way to access SimpleOrder by index is to cast it to // Collection<OrderItem>. Otherwise the index is interpreted // as a key, and KeyNotFoundException is thrown. // Collection<OrderItem> coweekly = weekly; Console.WriteLine("\ncoweekly[2].Description: {0}", coweekly[2].Description); Console.WriteLine("\ncoweekly[2] = new OrderItem(...)"); coweekly[2] = new OrderItem(127700026, "Crank", 27, 5.98); OrderItem temp = coweekly[2]; // The IndexOf method, inherited from Collection<OrderItem>, // takes an OrderItem instead of a key. // Console.WriteLine("\nIndexOf(temp): {0}", weekly.IndexOf(temp)); // The inherited Remove method also takes an OrderItem. // Console.WriteLine("\nRemove(temp)"); weekly.Remove(temp); Console.WriteLine("\nRemoveAt(0)"); weekly.RemoveAt(0); // Increase the quantity for a line item. Console.WriteLine("\ncoweekly(1) = New OrderItem(...)"); coweekly[1] = new OrderItem(coweekly[1].PartNumber, coweekly[1].Description, coweekly[1].Quantity + 1000, coweekly[1].UnitPrice); Display(weekly); Console.WriteLine(); weekly.Clear(); } private static void Display(SimpleOrder order) { Console.WriteLine(); foreach( OrderItem item in order ) { Console.WriteLine(item); } } private static void ChangedHandler(object source, SimpleOrderChangedEventArgs e) { OrderItem item = e.ChangedItem; if (e.ChangeType==ChangeType.Replaced) { OrderItem replacement = e.ReplacedWith; Console.WriteLine("{0} (quantity {1}) was replaced " + "by {2}, (quantity {3}).", item.Description, item.Quantity, replacement.Description, replacement.Quantity); } else if(e.ChangeType == ChangeType.Cleared) { Console.WriteLine("The order list was cleared."); } else { Console.WriteLine("{0} (quantity {1}) was {2}.", item.Description, item.Quantity, e.ChangeType); } } } // This class represents a simple line item in an order. All the // values are immutable except quantity. // public class OrderItem { private int _partNumber; private string _description; private double _unitPrice; private int _quantity; public int PartNumber { get { return _partNumber; }} public string Description { get { return _description; }} public double UnitPrice { get { return _unitPrice; }} public int Quantity { get { return _quantity; }} public OrderItem(int partNumber, string description, int quantity, double unitPrice) { _partNumber = partNumber; _description = description; _quantity = quantity; _unitPrice = unitPrice; } public override string ToString() { return String.Format( "{0,9} {1,6} {2,-12} at {3,8:#,###.00} = {4,10:###,###.00}", PartNumber, _quantity, Description, UnitPrice, UnitPrice * _quantity); } } /* This code example produces the following output: Widget (quantity 400) was Added. Sprocket (quantity 27) was Added. Motor (quantity 10) was Added. Gear (quantity 175) was Added. 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 101030411 10 Motor at 237.50 = 2,375.00 110072684 175 Gear at 5.17 = 904.75 Contains(101030411): True weekly[101030411].Description: Motor Remove(101030411) Motor (quantity 10) was Removed. Insert(2, new OrderItem(...)) Nut (quantity 10) was Added. coweekly[2].Description: Nut coweekly[2] = new OrderItem(...) Nut (quantity 10) was replaced by Crank, (quantity 27). IndexOf(temp): 2 Remove(temp) Crank (quantity 27) was Removed. RemoveAt(0) Widget (quantity 400) was Removed. coweekly(1) = New OrderItem(...) Gear (quantity 175) was replaced by Gear, (quantity 1175). 110072675 27 Sprocket at 5.30 = 143.10 110072684 1175 Gear at 5.17 = 6,074.75 The order list was cleared. */
using namespace System; using namespace System::Collections::Generic; using namespace System::Collections::ObjectModel; public enum class ChangeTypes { Added, Removed, Replaced, Cleared }; ref class SimpleOrderChangedEventArgs; // This class represents a simple line item in an order. All the // values are immutable except quantity. // public ref class OrderItem { private: int _quantity; public: initonly int PartNumber; initonly String^ Description; initonly double UnitPrice; OrderItem(int partNumber, String^ description, int quantity, double unitPrice) { this->PartNumber = partNumber; this->Description = description; this->Quantity = quantity; this->UnitPrice = unitPrice; }; property int Quantity { int get() { return _quantity; }; void set(int value) { if (value < 0) throw gcnew ArgumentException("Quantity cannot be negative."); _quantity = value; }; }; virtual String^ ToString() override { return String::Format( "{0,9} {1,6} {2,-12} at {3,8:#,###.00} = {4,10:###,###.00}", PartNumber, _quantity, Description, UnitPrice, UnitPrice * _quantity); }; }; // Event argument for the Changed event. // public ref class SimpleOrderChangedEventArgs : EventArgs { public: OrderItem^ ChangedItem; initonly ChangeTypes ChangeType; OrderItem^ ReplacedWith; SimpleOrderChangedEventArgs(ChangeTypes change, OrderItem^ item, OrderItem^ replacement) { this->ChangeType = change; this->ChangedItem = item; this->ReplacedWith = replacement; } }; // This class derives from KeyedCollection and shows how to override // the protected ClearItems, InsertItem, RemoveItem, and SetItem // methods in order to change the behavior of the default Item // property and the Add, Clear, Insert, and Remove methods. The // class implements a Changed event, which is raised by all the // protected methods. // // SimpleOrder is a collection of OrderItem objects, and its key // is the PartNumber field of OrderItem-> PartNumber is an Integer , // so SimpleOrder inherits KeyedCollection<int, OrderItem>. // (Note that the key of OrderItem cannot be changed; if it could // be changed, SimpleOrder would have to override ChangeItemKey.) // public ref class SimpleOrder : KeyedCollection<int, OrderItem^> { public: event EventHandler<SimpleOrderChangedEventArgs^>^ Changed; // This parameterless constructor calls the base class constructor // that specifies a dictionary threshold of 0, so that the internal // dictionary is created as soon as an item is added to the // collection. // SimpleOrder() : KeyedCollection<int, OrderItem^>(nullptr, 0) {}; // This is the only method that absolutely must be overridden, // because without it the KeyedCollection cannot extract the // keys from the items. // protected: virtual int GetKeyForItem(OrderItem^ item) override { // In this example, the key is the part number. return item->PartNumber; } virtual void InsertItem(int index, OrderItem^ newItem) override { __super::InsertItem(index, newItem); Changed(this, gcnew SimpleOrderChangedEventArgs( ChangeTypes::Added, newItem, nullptr)); } virtual void SetItem(int index, OrderItem^ newItem) override { OrderItem^ replaced = this->Items[index]; __super::SetItem(index, newItem); Changed(this, gcnew SimpleOrderChangedEventArgs( ChangeTypes::Replaced, replaced, newItem)); } virtual void RemoveItem(int index) override { OrderItem^ removedItem = Items[index]; __super::RemoveItem(index); Changed(this, gcnew SimpleOrderChangedEventArgs( ChangeTypes::Removed, removedItem, nullptr)); } virtual void ClearItems() override { __super::ClearItems(); Changed(this, gcnew SimpleOrderChangedEventArgs( ChangeTypes::Cleared, nullptr, nullptr)); } // This method uses the internal reference to the dictionary // to test fo public: void AddOrMerge(OrderItem^ newItem) { int key = this->GetKeyForItem(newItem); OrderItem^ existingItem = nullptr; // The dictionary is not created until the first item is // added, so it is necessary to test for null. Using // AndAlso ensures that TryGetValue is not called if the // dictionary does not exist. // if (this->Dictionary != nullptr && this->Dictionary->TryGetValue(key, existingItem)) { existingItem->Quantity += newItem->Quantity; } else { this->Add(newItem); } } }; public ref class Demo { public: static void Main() { SimpleOrder^ weekly = gcnew SimpleOrder(); weekly->Changed += gcnew EventHandler<SimpleOrderChangedEventArgs^>(ChangedHandler); // The Add method, inherited from Collection, takes OrderItem-> // weekly->Add(gcnew OrderItem(110072674, "Widget", 400, 45.17)); weekly->Add(gcnew OrderItem(110072675, "Sprocket", 27, 5.3)); weekly->Add(gcnew OrderItem(101030411, "Motor", 10, 237.5)); weekly->Add(gcnew OrderItem(110072684, "Gear", 175, 5.17)); Display(weekly); // The Contains method of KeyedCollection takes TKey. // Console::WriteLine("\nContains(101030411): {0}", weekly->Contains(101030411)); // The default Item property of KeyedCollection takes the key // type, Integer. The property is read-only. // Console::WriteLine("\nweekly[101030411]->Description: {0}", weekly[101030411]->Description); // The Remove method of KeyedCollection takes a key. // Console::WriteLine("\nRemove(101030411)"); weekly->Remove(101030411); // The Insert method, inherited from Collection, takes an // index and an OrderItem. // Console::WriteLine("\nInsert(2, gcnew OrderItem(...))"); weekly->Insert(2, gcnew OrderItem(111033401, "Nut", 10, .5)); // The default Item property is overloaded. One overload comes // from KeyedCollection<int, OrderItem>; that overload // is read-only, and takes Integer because it retrieves by key. // The other overload comes from Collection<OrderItem>, the // base class of KeyedCollection<int, OrderItem>; it // retrieves by index, so it also takes an Integer. The compiler // uses the most-derived overload, from KeyedCollection, so the // only way to access SimpleOrder by index is to cast it to // Collection<OrderItem>. Otherwise the index is interpreted // as a key, and KeyNotFoundException is thrown. // Collection<OrderItem^>^ coweekly = weekly; Console::WriteLine("\ncoweekly[2].Description: {0}", coweekly[2]->Description); Console::WriteLine("\ncoweekly[2] = gcnew OrderItem(...)"); coweekly[2] = gcnew OrderItem(127700026, "Crank", 27, 5.98); OrderItem^ temp = coweekly[2]; // The IndexOf method, inherited from Collection<OrderItem>, // takes an OrderItem instead of a key. // Console::WriteLine("\nIndexOf(temp): {0}", weekly->IndexOf(temp)); // The inherited Remove method also takes an OrderItem-> // Console::WriteLine("\nRemove(temp)"); weekly->Remove(temp); Console::WriteLine("\nRemoveAt(0)"); weekly->RemoveAt(0); weekly->AddOrMerge(gcnew OrderItem(110072684, "Gear", 1000, 5.17)); Display(weekly); Console::WriteLine(); weekly->Clear(); } private: static void Display(SimpleOrder^ order) { Console::WriteLine(); for each( OrderItem^ item in order ) { Console::WriteLine(item); } } static void ChangedHandler(Object^ source, SimpleOrderChangedEventArgs^ e) { OrderItem^ item = e->ChangedItem; if (e->ChangeType == ChangeTypes::Replaced) { OrderItem^ replacement = e->ReplacedWith; Console::WriteLine("{0} (quantity {1}) was replaced " + "by {2}, (quantity {3}).", item->Description, item->Quantity, replacement->Description, replacement->Quantity); } else if(e->ChangeType == ChangeTypes::Cleared) { Console::WriteLine("The order list was cleared."); } else { Console::WriteLine("{0} (quantity {1}) was {2}.", item->Description, item->Quantity, e->ChangeType); } } }; void main() { Demo::Main(); } /* This code example produces the following output: Widget (quantity 400) was Added. Sprocket (quantity 27) was Added. Motor (quantity 10) was Added. Gear (quantity 175) was Added. 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 101030411 10 Motor at 237.50 = 2,375.00 110072684 175 Gear at 5.17 = 904.75 Contains(101030411): True weekly[101030411]->Description: Motor Remove(101030411) Motor (quantity 10) was Removed. Insert(2, gcnew OrderItem(...)) Nut (quantity 10) was Added. coweekly[2].Description: Nut coweekly[2] = gcnew OrderItem(...) Nut (quantity 10) was replaced by Crank, (quantity 27). IndexOf(temp): 2 Remove(temp) Crank (quantity 27) was Removed. RemoveAt(0) Widget (quantity 400) was Removed. 110072675 27 Sprocket at 5.30 = 143.10 110072684 1175 Gear at 5.17 = 6,074.75 The order list was cleared. */

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 名前空間
IEqualityComparer ジェネリック インターフェイス
KeyedCollection ジェネリック クラス
アセンブリ: mscorlib (mscorlib.dll 内)

<SerializableAttribute> _ <ComVisibleAttribute(False)> _ Public MustInherit Class KeyedCollection(Of TKey, TItem) Inherits Collection(Of TItem)
[SerializableAttribute] [ComVisibleAttribute(false)] public abstract class KeyedCollection<TKey,TItem> : Collection<TItem>
[SerializableAttribute] [ComVisibleAttribute(false)] generic<typename TKey, typename TItem> public ref class KeyedCollection abstract : public Collection<TItem>

KeyedCollection クラスでは、O(1) のインデックスによる取得と、O(1) に近いキーによる取得の両方を使用できます。これは抽象型 (Visual Basic の場合は MustInherit) ですが、このクラスの構築ジェネリック型がそれぞれ抽象基本クラスとなるため、より正確には、無数にある抽象型の集合ということもできます。KeyedCollection を使用するには、適切な構築型からコレクション型を派生させます。
KeyedCollection クラスは、IList ジェネリック インターフェイスに基づいたコレクションと IDictionary ジェネリック インターフェイスに基づいたコレクションの両方の特性を備えています。IList ジェネリック インターフェイスに基づいたコレクションと同様に、KeyedCollection も、項目のインデックス付けされたリストです。IDictionary ジェネリック インターフェイスに基づいたコレクションと同様に、KeyedCollection にも各要素に関連付けられたキーがあります。
ディクショナリと異なり、KeyedCollection の要素はキー/値ペアではなく、この場合は、要素全体が値であり、キーはその値内に埋め込まれています。たとえば、KeyedCollection<String,String> (Visual Basic の場合は KeyedCollection(Of String, String)) から派生したコレクションに "John Doe Jr." という要素があるとき、この要素の値が "John Doe Jr."、キーが "Doe" であるような場合が考えられます。また、整数キーを含む従業員レコードのコレクションを KeyedCollection<int,Employee> から派生させることもできます。抽象メソッド GetKeyForItem (Visual Basic の場合は MustOverride) は、キーを要素から抽出します。
既定では、KeyedCollection には検索ディクショナリが含まれます。高速な検索を可能にするため、KeyedCollection に項目が追加されると、項目のキーが 1 度だけ抽出され、検索ディクショナリに保存されます。KeyedCollection を作成する場合、この動作は、ディクショナリ作成のしきい値を指定することによりオーバーライドできます。検索ディクショナリは、要素の数が最初にそのしきい値を超えたときに作成されます。しきい値として –1 を指定した場合、検索ディクショナリは作成されません。既定のディクショナリ作成のしきい値はゼロ (0) です。
![]() |
---|
内部検索ディクショナリを使用する場合、このディクショナリには、TItem が参照型のときはコレクションのすべての項目への参照が含まれ、TItem が値型のときはコレクションのすべての項目のコピーが含まれます。したがって、TItem が値型のときに検索ディクショナリを使用するのは適切ではありません。 |
KeyedCollection 内のすべてのキーは一意である必要があります。キーには null 参照 (Visual Basic では Nothing) は使用できません。

このセクションには、2 つのコード例が含まれています。最初の例は、KeyedCollection から派生させるための必要最小限のコードであり、多数のメソッドを継承しています。2 番目の例は、KeyedCollection のプロテクト メソッドをオーバーライドしてカスタム動作を提供する方法を示しています。
このコード例は、KeyedCollection からコレクション クラスを派生させるために必要な最小限のコードを示しています。GetKeyForItem メソッドをオーバーライドし、基本クラス コンストラクタに処理を代行させるパブリック コンストラクタを用意しています。また、KeyedCollection クラスおよび Collection クラスから継承されたプロパティおよびメソッドも多数示しています。
SimpleOrder クラスは、OrderItem オブジェクトを含んでいる非常に単純な発注リストです。各オブジェクトは行項目を順番に表します。OrderItem のキーは変更できません。これは、KeyedCollection の派生クラスを使用する際に考慮する必要がある重要な事項です。変更可能なキーを使用するコード例の詳細については、ChangeItemKey のトピックを参照してください。
Imports System Imports System.Collections.Generic Imports System.Collections.ObjectModel ' This class represents a very simple keyed list of OrderItems, ' inheriting most of its behavior from the KeyedCollection and ' Collection classes. The immediate base class is the constructed ' type KeyedCollection(Of Integer, OrderItem). When you inherit ' from KeyedCollection, the second generic type argument is the ' type that you want to store in the collection -- in this case ' OrderItem. The first generic argument is the type that you want ' to use as a key. Its values must be calculated from OrderItem; ' in this case it is the Integer field PartNumber, so SimpleOrder ' inherits KeyedCollection(Of Integer, OrderItem). ' Public Class SimpleOrder Inherits KeyedCollection(Of Integer, OrderItem) ' The parameterless constructor of the base class creates a ' KeyedCollection with an internal dictionary. For this code ' example, no other constructors are exposed. ' Public Sub New() MyBase.New() End Sub ' This is the only method that absolutely must be overridden, ' because without it the KeyedCollection cannot extract the ' keys from the items. The input parameter type is the ' second generic type argument, in this case OrderItem, and ' the return value type is the first generic type argument, ' in this case Integer. ' Protected Overrides Function GetKeyForItem( _ ByVal item As OrderItem) As Integer ' In this example, the key is the part number. Return item.PartNumber End Function End Class Public Class Demo Public Shared Sub Main() Dim weekly As New SimpleOrder() ' The Add method, inherited from Collection, takes OrderItem. ' weekly.Add(New OrderItem(110072674, "Widget", 400, 45.17)) weekly.Add(New OrderItem(110072675, "Sprocket", 27, 5.3)) weekly.Add(New OrderItem(101030411, "Motor", 10, 237.5)) weekly.Add(New OrderItem(110072684, "Gear", 175, 5.17)) Display(weekly) ' The Contains method of KeyedCollection takes TKey. ' Console.WriteLine(vbLf & "Contains(101030411): {0}", _ weekly.Contains(101030411)) ' The default Item property of KeyedCollection takes the key ' type, Integer. ' Console.WriteLine(vbLf & "weekly(101030411).Description: {0}", _ weekly(101030411).Description) ' The Remove method of KeyedCollection takes a key. ' Console.WriteLine(vbLf & "Remove(101030411)") weekly.Remove(101030411) Display(weekly) ' The Insert method, inherited from Collection, takes an ' index and an OrderItem. ' Console.WriteLine(vbLf & "Insert(2, New OrderItem(...))") weekly.Insert(2, New OrderItem(111033401, "Nut", 10, .5)) Display(weekly) ' The default Item property is overloaded. One overload comes ' from KeyedCollection(Of Integer, OrderItem); that overload ' is read-only, and takes Integer because it retrieves by key. ' The other overload comes from Collection(Of OrderItem), the ' base class of KeyedCollection(Of Integer, OrderItem); it ' retrieves by index, so it also takes an Integer. The compiler ' uses the most-derived overload, from KeyedCollection, so the ' only way to access SimpleOrder by index is to cast it to ' Collection(Of OrderItem). Otherwise the index is interpreted ' as a key, and KeyNotFoundException is thrown. ' Dim coweekly As Collection(Of OrderItem) = weekly Console.WriteLine(vbLf & "coweekly(2).Description: {0}", _ coweekly(2).Description) Console.WriteLine(vbLf & "coweekly(2) = New OrderItem(...)") coweekly(2) = New OrderItem(127700026, "Crank", 27, 5.98) Dim temp As OrderItem = coweekly(2) ' The IndexOf method, inherited from Collection(Of OrderItem), ' takes an OrderItem instead of a key. ' Console.WriteLine(vbLf & "IndexOf(temp): {0}", _ weekly.IndexOf(temp)) ' The inherited Remove method also takes an OrderItem. ' Console.WriteLine(vbLf & "Remove(temp)") weekly.Remove(temp) Display(weekly) Console.WriteLine(vbLf & "RemoveAt(0)") weekly.RemoveAt(0) Display(weekly) End Sub Private Shared Sub Display(ByVal order As SimpleOrder) Console.WriteLine() For Each item As OrderItem In order Console.WriteLine(item) Next item End Sub End Class ' This class represents a simple line item in an order. All the ' values are immutable except quantity. ' Public Class OrderItem Public ReadOnly PartNumber As Integer Public ReadOnly Description As String Public ReadOnly UnitPrice As Double Private _quantity As Integer = 0 Public Sub New(ByVal partNumber As Integer, _ ByVal description As String, _ ByVal quantity As Integer, _ ByVal unitPrice As Double) Me.PartNumber = partNumber Me.Description = description Me.Quantity = quantity Me.UnitPrice = unitPrice End Sub 'New Public Property Quantity() As Integer Get Return _quantity End Get Set If value < 0 Then Throw New ArgumentException("Quantity cannot be negative.") End If _quantity = value End Set End Property Public Overrides Function ToString() As String Return String.Format( _ "{0,9} {1,6} {2,-12} at {3,8:#,###.00} = {4,10:###,###.00}", _ PartNumber, _quantity, Description, UnitPrice, _ UnitPrice * _quantity) End Function End Class ' This code example produces the following output: ' '110072674 400 Widget at 45.17 = 18,068.00 '110072675 27 Sprocket at 5.30 = 143.10 '101030411 10 Motor at 237.50 = 2,375.00 '110072684 175 Gear at 5.17 = 904.75 ' 'Contains(101030411): True ' 'weekly(101030411).Description: Motor ' 'Remove(101030411) ' '110072674 400 Widget at 45.17 = 18,068.00 '110072675 27 Sprocket at 5.30 = 143.10 '110072684 175 Gear at 5.17 = 904.75 ' 'Insert(2, New OrderItem(...)) ' '110072674 400 Widget at 45.17 = 18,068.00 '110072675 27 Sprocket at 5.30 = 143.10 '111033401 10 Nut at .50 = 5.00 '110072684 175 Gear at 5.17 = 904.75 ' 'coweekly(2).Description: Nut ' 'coweekly(2) = New OrderItem(...) ' 'IndexOf(temp): 2 ' 'Remove(temp) ' '110072674 400 Widget at 45.17 = 18,068.00 '110072675 27 Sprocket at 5.30 = 143.10 '110072684 175 Gear at 5.17 = 904.75 ' 'RemoveAt(0) ' '110072675 27 Sprocket at 5.30 = 143.10 '110072684 175 Gear at 5.17 = 904.75
using System; using System.Collections.Generic; using System.Collections.ObjectModel; // This class represents a very simple keyed list of OrderItems, // inheriting most of its behavior from the KeyedCollection and // Collection classes. The immediate base class is the constructed // type KeyedCollection<int, OrderItem>. When you inherit // from KeyedCollection, the second generic type argument is the // type that you want to store in the collection -- in this case // OrderItem. The first type argument is the type that you want // to use as a key. Its values must be calculated from OrderItem; // in this case it is the int field PartNumber, so SimpleOrder // inherits KeyedCollection<int, OrderItem>. // public class SimpleOrder : KeyedCollection<int, OrderItem> { // The parameterless constructor of the base class creates a // KeyedCollection with an internal dictionary. For this code // example, no other constructors are exposed. // public SimpleOrder() : base() {} // This is the only method that absolutely must be overridden, // because without it the KeyedCollection cannot extract the // keys from the items. The input parameter type is the // second generic type argument, in this case OrderItem, and // the return value type is the first generic type argument, // in this case int. // protected override int GetKeyForItem(OrderItem item) { // In this example, the key is the part number. return item.PartNumber; } } public class Demo { public static void Main() { SimpleOrder weekly = new SimpleOrder(); // The Add method, inherited from Collection, takes OrderItem. // weekly.Add(new OrderItem(110072674, "Widget", 400, 45.17)); weekly.Add(new OrderItem(110072675, "Sprocket", 27, 5.3)); weekly.Add(new OrderItem(101030411, "Motor", 10, 237.5)); weekly.Add(new OrderItem(110072684, "Gear", 175, 5.17)); Display(weekly); // The Contains method of KeyedCollection takes the key, // type, in this case int. // Console.WriteLine("\nContains(101030411): {0}", weekly.Contains(101030411)); // The default Item property of KeyedCollection takes a key. // Console.WriteLine("\nweekly[101030411].Description: {0}", weekly[101030411].Description); // The Remove method of KeyedCollection takes a key. // Console.WriteLine("\nRemove(101030411)"); weekly.Remove(101030411); Display(weekly); // The Insert method, inherited from Collection, takes an // index and an OrderItem. // Console.WriteLine("\nInsert(2, New OrderItem(...))"); weekly.Insert(2, new OrderItem(111033401, "Nut", 10, .5)); Display(weekly); // The default Item property is overloaded. One overload comes // from KeyedCollection<int, OrderItem>; that overload // is read-only, and takes Integer because it retrieves by key. // The other overload comes from Collection<OrderItem>, the // base class of KeyedCollection<int, OrderItem>; it // retrieves by index, so it also takes an Integer. The compiler // uses the most-derived overload, from KeyedCollection, so the // only way to access SimpleOrder by index is to cast it to // Collection<OrderItem>. Otherwise the index is interpreted // as a key, and KeyNotFoundException is thrown. // Collection<OrderItem> coweekly = weekly; Console.WriteLine("\ncoweekly[2].Description: {0}", coweekly[2].Description); Console.WriteLine("\ncoweekly[2] = new OrderItem(...)"); coweekly[2] = new OrderItem(127700026, "Crank", 27, 5.98); OrderItem temp = coweekly[2]; // The IndexOf method inherited from Collection<OrderItem> // takes an OrderItem instead of a key // Console.WriteLine("\nIndexOf(temp): {0}", weekly.IndexOf(temp)); // The inherited Remove method also takes an OrderItem. // Console.WriteLine("\nRemove(temp)"); weekly.Remove(temp); Display(weekly); Console.WriteLine("\nRemoveAt(0)"); weekly.RemoveAt(0); Display(weekly); } private static void Display(SimpleOrder order) { Console.WriteLine(); foreach( OrderItem item in order ) { Console.WriteLine(item); } } } // This class represents a simple line item in an order. All the // values are immutable except quantity. // public class OrderItem { public readonly int PartNumber; public readonly string Description; public readonly double UnitPrice; private int _quantity = 0; public OrderItem(int partNumber, string description, int quantity, double unitPrice) { this.PartNumber = partNumber; this.Description = description; this.Quantity = quantity; this.UnitPrice = unitPrice; } public int Quantity { get { return _quantity; } set { if (value<0) throw new ArgumentException("Quantity cannot be negative."); _quantity = value; } } public override string ToString() { return String.Format( "{0,9} {1,6} {2,-12} at {3,8:#,###.00} = {4,10:###,###.00}", PartNumber, _quantity, Description, UnitPrice, UnitPrice * _quantity); } } /* This code example produces the following output: 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 101030411 10 Motor at 237.50 = 2,375.00 110072684 175 Gear at 5.17 = 904.75 Contains(101030411): True weekly[101030411].Description: Motor Remove(101030411) 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 110072684 175 Gear at 5.17 = 904.75 Insert(2, New OrderItem(...)) 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 111033401 10 Nut at .50 = 5.00 110072684 175 Gear at 5.17 = 904.75 coweekly[2].Description: Nut coweekly[2] = new OrderItem(...) IndexOf(temp): 2 Remove(temp) 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 110072684 175 Gear at 5.17 = 904.75 RemoveAt(0) 110072675 27 Sprocket at 5.30 = 143.10 110072684 175 Gear at 5.17 = 904.75 */
using namespace System; using namespace System::Collections::Generic; using namespace System::Collections::ObjectModel; // This class represents a simple line item in an order. All the // values are immutable except quantity. // public ref class OrderItem { private: int _quantity; public: initonly int PartNumber; initonly String^ Description; initonly double UnitPrice; OrderItem(int partNumber, String^ description, int quantity, double unitPrice) { this->PartNumber = partNumber; this->Description = description; this->Quantity = quantity; this->UnitPrice = unitPrice; } property int Quantity { int get() { return _quantity; } void set(int value) { if (value < 0) throw gcnew ArgumentException("Quantity cannot be negative."); _quantity = value; } } virtual String^ ToString() override { return String::Format( "{0,9} {1,6} {2,-12} at {3,8:#,###.00} = {4,10:###,###.00}", PartNumber, _quantity, Description, UnitPrice, UnitPrice * _quantity); } }; // This class represents a very simple keyed list of OrderItems, // inheriting most of its behavior from the KeyedCollection and // Collection classes. The immediate base class is the constructed // type KeyedCollection<int, OrderItem>. When you inherit // from KeyedCollection, the second generic type argument is the // type that you want to store in the collection -- in this case // OrderItem. The first type argument is the type that you want // to use as a key. Its values must be calculated from OrderItem; // in this case it is the int field PartNumber, so SimpleOrder // inherits KeyedCollection<int, OrderItem>. // public ref class SimpleOrder : KeyedCollection<int, OrderItem^> { // The parameterless constructor of the base class creates a // KeyedCollection with an internal dictionary. For this code // example, no other constructors are exposed. // public: SimpleOrder() {} // This is the only method that absolutely must be overridden, // because without it the KeyedCollection cannot extract the // keys from the items. The input parameter type is the // second generic type argument, in this case OrderItem, and // the return value type is the first generic type argument, // in this case int. // protected: virtual int GetKeyForItem(OrderItem^ item) override { // In this example, the key is the part number. return item->PartNumber; } }; public ref class Demo { public: static void Main() { SimpleOrder^ weekly = gcnew SimpleOrder(); // The Add method, inherited from Collection, takes OrderItem. // weekly->Add(gcnew OrderItem(110072674, "Widget", 400, 45.17)); weekly->Add(gcnew OrderItem(110072675, "Sprocket", 27, 5.3)); weekly->Add(gcnew OrderItem(101030411, "Motor", 10, 237.5)); weekly->Add(gcnew OrderItem(110072684, "Gear", 175, 5.17)); Display(weekly); // The Contains method of KeyedCollection takes the key, // type, in this case int. // Console::WriteLine("\nContains(101030411): {0}", weekly->Contains(101030411)); // The default Item property of KeyedCollection takes a key. // Console::WriteLine("\nweekly(101030411)->Description: {0}", weekly[101030411]->Description); // The Remove method of KeyedCollection takes a key. // Console::WriteLine("\nRemove(101030411)"); weekly->Remove(101030411); Display(weekly); // The Insert method, inherited from Collection, takes an // index and an OrderItem. // Console::WriteLine("\nInsert(2, New OrderItem(...))"); weekly->Insert(2, gcnew OrderItem(111033401, "Nut", 10, .5)); Display(weekly); // The default Item property is overloaded. One overload comes // from KeyedCollection<int, OrderItem>; that overload // is read-only, and takes Integer because it retrieves by key. // The other overload comes from Collection<OrderItem>, the // base class of KeyedCollection<int, OrderItem>; it // retrieves by index, so it also takes an Integer. The compiler // uses the most-derived overload, from KeyedCollection, so the // only way to access SimpleOrder by index is to cast it to // Collection<OrderItem>. Otherwise the index is interpreted // as a key, and KeyNotFoundException is thrown. // Collection<OrderItem^>^ coweekly = weekly; Console::WriteLine("\ncoweekly[2].Description: {0}", coweekly[2]->Description); Console::WriteLine("\ncoweekly[2] = gcnew OrderItem(...)"); coweekly[2] = gcnew OrderItem(127700026, "Crank", 27, 5.98); OrderItem^ temp = coweekly[2]; // The IndexOf method inherited from Collection<OrderItem> // takes an OrderItem instead of a key // Console::WriteLine("\nIndexOf(temp): {0}", weekly->IndexOf(temp)); // The inherited Remove method also takes an OrderItem. // Console::WriteLine("\nRemove(temp)"); weekly->Remove(temp); Display(weekly); Console::WriteLine("\nRemoveAt(0)"); weekly->RemoveAt(0); Display(weekly); } private: static void Display(SimpleOrder^ order) { Console::WriteLine(); for each( OrderItem^ item in order ) { Console::WriteLine(item); } } }; void main() { Demo::Main(); } /* This code example produces the following output: 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 101030411 10 Motor at 237.50 = 2,375.00 110072684 175 Gear at 5.17 = 904.75 Contains(101030411): True weekly(101030411)->Description: Motor Remove(101030411) 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 110072684 175 Gear at 5.17 = 904.75 Insert(2, New OrderItem(...)) 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 111033401 10 Nut at .50 = 5.00 110072684 175 Gear at 5.17 = 904.75 coweekly(2)->Description: Nut coweekly[2] = gcnew OrderItem(...) IndexOf(temp): 2 Remove(temp) 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 110072684 175 Gear at 5.17 = 904.75 RemoveAt(0) 110072675 27 Sprocket at 5.30 = 143.10 110072684 175 Gear at 5.17 = 904.75 */
このコード例では、InsertItem、RemoveItem、ClearItems、および SetItem の各プロテクト メソッドをオーバーライドする方法を示し、Add、Remove、および Clear の各メソッドのカスタム動作と、既定の Item プロパティ (C# の場合はインデクサ) を設定するためのカスタム動作を提供します。この例で提供されるカスタム動作は、Changed という名前の通知イベントです。これは、オーバーライドされた各メソッドの最後で発生します。
このコード例では、SimpleOrder クラスを作成します。このクラスは、KeyedCollection から派生し、単純な注文フォームを表しています。この注文フォームには、注文する項目を表す OrderItem オブジェクトが含まれています。また、イベント情報や、変更の種類を識別する列挙を含めるために、SimpleOrderChangedEventArgs クラスも作成します。
Demo クラスの Main メソッドで、派生クラスのプロパティおよびメソッドを呼び出すことにより、カスタム動作の例を示します。
このコード例では、変更できないキーを持つオブジェクトを使用します。変更可能なキーを使用するコード例の詳細については、ChangeItemKey のトピックを参照してください。
Imports System Imports System.Collections.Generic Imports System.Collections.ObjectModel ' This class derives from KeyedCollection and shows how to override ' the protected ClearItems, InsertItem, RemoveItem, and SetItem ' methods in order to change the behavior of the default Item ' property and the Add, Clear, Insert, and Remove methods. The ' class implements a Changed event, which is raised by all the ' protected methods. ' ' SimpleOrder is a collection of OrderItem objects, and its key ' is the PartNumber field of OrderItem. PartNumber is an Integer, ' so SimpleOrder inherits KeyedCollection(Of Integer, OrderItem). ' (Note that the key of OrderItem cannot be changed; if it could ' be changed, SimpleOrder would have to override ChangeItemKey.) ' Public Class SimpleOrder Inherits KeyedCollection(Of Integer, OrderItem) Public Event Changed As EventHandler(Of SimpleOrderChangedEventArgs) ' This parameterless constructor calls the base class constructor ' that specifies a dictionary threshold of 0, so that the internal ' dictionary is created as soon as an item is added to the ' collection. ' Public Sub New() MyBase.New(Nothing, 0) End Sub ' This is the only method that absolutely must be overridden, ' because without it the KeyedCollection cannot extract the ' keys from the items. ' Protected Overrides Function GetKeyForItem( _ ByVal item As OrderItem) As Integer ' In this example, the key is the part number. Return item.PartNumber End Function Protected Overrides Sub InsertItem( _ ByVal index As Integer, ByVal newItem As OrderItem) MyBase.InsertItem(index, newItem) RaiseEvent Changed(Me, New SimpleOrderChangedEventArgs( _ ChangeType.Added, newItem, Nothing)) End Sub Protected Overrides Sub SetItem(ByVal index As Integer, _ ByVal newItem As OrderItem) Dim replaced As OrderItem = Items(index) MyBase.SetItem(index, newItem) RaiseEvent Changed(Me, New SimpleOrderChangedEventArgs( _ ChangeType.Replaced, replaced, newItem)) End Sub Protected Overrides Sub RemoveItem(ByVal index As Integer) Dim removedItem As OrderItem = Items(index) MyBase.RemoveItem(index) RaiseEvent Changed(Me, New SimpleOrderChangedEventArgs( _ ChangeType.Removed, removedItem, Nothing)) End Sub Protected Overrides Sub ClearItems() MyBase.ClearItems() RaiseEvent Changed(Me, New SimpleOrderChangedEventArgs( _ ChangeType.Cleared, Nothing, Nothing)) End Sub End Class ' Event argument for the Changed event. ' Public Class SimpleOrderChangedEventArgs Inherits EventArgs Private _changedItem As OrderItem Private _changeType As ChangeType Private _replacedWith As OrderItem Public ReadOnly Property ChangedItem As OrderItem Get Return _changedItem End Get End Property Public ReadOnly Property ChangeType As ChangeType Get Return _changeType End Get End Property Public ReadOnly Property ReplacedWith As OrderItem Get Return _replacedWith End Get End Property Public Sub New(ByVal change As ChangeType, ByVal item As OrderItem, _ ByVal replacement As OrderItem) _changeType = change _changedItem = item _replacedWith = replacement End Sub End Class Public Enum ChangeType Added Removed Replaced Cleared End Enum Public Class Demo Public Shared Sub Main() Dim weekly As New SimpleOrder() AddHandler weekly.Changed, AddressOf ChangedHandler ' The Add method, inherited from Collection, takes OrderItem. ' weekly.Add(New OrderItem(110072674, "Widget", 400, 45.17)) weekly.Add(New OrderItem(110072675, "Sprocket", 27, 5.3)) weekly.Add(New OrderItem(101030411, "Motor", 10, 237.5)) weekly.Add(New OrderItem(110072684, "Gear", 175, 5.17)) Display(weekly) ' The Contains method of KeyedCollection takes TKey. ' Console.WriteLine(vbLf & "Contains(101030411): {0}", _ weekly.Contains(101030411)) ' The default Item property of KeyedCollection takes the key ' type, Integer. The property is read-only. ' Console.WriteLine(vbLf & "weekly(101030411).Description: {0}", _ weekly(101030411).Description) ' The Remove method of KeyedCollection takes a key. ' Console.WriteLine(vbLf & "Remove(101030411)") weekly.Remove(101030411) ' The Insert method, inherited from Collection, takes an ' index and an OrderItem. ' Console.WriteLine(vbLf & "Insert(2, New OrderItem(...))") weekly.Insert(2, New OrderItem(111033401, "Nut", 10, .5)) ' The default Item property is overloaded. One overload comes ' from KeyedCollection(Of Integer, OrderItem); that overload ' is read-only, and takes Integer because it retrieves by key. ' The other overload comes from Collection(Of OrderItem), the ' base class of KeyedCollection(Of Integer, OrderItem); it ' retrieves by index, so it also takes an Integer. The compiler ' uses the most-derived overload, from KeyedCollection, so the ' only way to access SimpleOrder by index is to cast it to ' Collection(Of OrderItem). Otherwise the index is interpreted ' as a key, and KeyNotFoundException is thrown. ' Dim coweekly As Collection(Of OrderItem) = weekly Console.WriteLine(vbLf & "coweekly(2).Description: {0}", _ coweekly(2).Description) Console.WriteLine(vbLf & "coweekly(2) = New OrderItem(...)") coweekly(2) = New OrderItem(127700026, "Crank", 27, 5.98) Dim temp As OrderItem = coweekly(2) ' The IndexOf method, inherited from Collection(Of OrderItem), ' takes an OrderItem instead of a key. ' Console.WriteLine(vbLf & "IndexOf(temp): {0}", _ weekly.IndexOf(temp)) ' The inherited Remove method also takes an OrderItem. ' Console.WriteLine(vbLf & "Remove(temp)") weekly.Remove(temp) Console.WriteLine(vbLf & "RemoveAt(0)") weekly.RemoveAt(0) ' Increase the quantity for a line item. Console.WriteLine(vbLf & "coweekly(1) = New OrderItem(...)") coweekly(1) = New OrderItem(coweekly(1).PartNumber, _ coweekly(1).Description, coweekly(1).Quantity + 1000, _ coweekly(1).UnitPrice) Display(weekly) Console.WriteLine() weekly.Clear() End Sub Private Shared Sub Display(ByVal order As SimpleOrder) Console.WriteLine() For Each item As OrderItem In order Console.WriteLine(item) Next item End Sub Private Shared Sub ChangedHandler(ByVal source As Object, _ ByVal e As SimpleOrderChangedEventArgs) Dim item As OrderItem = e.ChangedItem If e.ChangeType = ChangeType.Replaced Then Dim replacement As OrderItem = e.ReplacedWith Console.WriteLine("{0} (quantity {1}) was replaced " & _ "by {2}, (quantity {3}).", item.Description, _ item.Quantity, replacement.Description, replacement.Quantity) ElseIf e.ChangeType = ChangeType.Cleared Then Console.WriteLine("The order list was cleared.") Else Console.WriteLine("{0} (quantity {1}) was {2}.", _ item.Description, item.Quantity, e.ChangeType) End If End Sub End Class ' This class represents a simple line item in an order. All the ' values are immutable except quantity. ' Public Class OrderItem Private _partNumber As Integer Private _description As String Private _unitPrice As Double Private _quantity As Integer Public ReadOnly Property PartNumber As Integer Get Return _partNumber End Get End Property Public ReadOnly Property Description As String Get Return _description End Get End Property Public ReadOnly Property UnitPrice As Double Get Return _unitPrice End Get End Property Public ReadOnly Property Quantity() As Integer Get Return _quantity End Get End Property Public Sub New(ByVal partNumber As Integer, _ ByVal description As String, _ ByVal quantity As Integer, _ ByVal unitPrice As Double) _partNumber = partNumber _description = description _quantity = quantity _unitPrice = unitPrice End Sub 'New Public Overrides Function ToString() As String Return String.Format( _ "{0,9} {1,6} {2,-12} at {3,8:#,###.00} = {4,10:###,###.00}", _ PartNumber, _quantity, Description, UnitPrice, _ UnitPrice * _quantity) End Function End Class ' This code example produces the following output: ' 'Widget (quantity 400) was Added. 'Sprocket (quantity 27) was Added. 'Motor (quantity 10) was Added. 'Gear (quantity 175) was Added. ' '110072674 400 Widget at 45.17 = 18,068.00 '110072675 27 Sprocket at 5.30 = 143.10 '101030411 10 Motor at 237.50 = 2,375.00 '110072684 175 Gear at 5.17 = 904.75 ' 'Contains(101030411): True ' 'weekly(101030411).Description: Motor ' 'Remove(101030411) 'Motor (quantity 10) was Removed. ' 'Insert(2, New OrderItem(...)) 'Nut (quantity 10) was Added. ' 'coweekly(2).Description: Nut ' 'coweekly(2) = New OrderItem(...) 'Nut (quantity 10) was replaced by Crank, (quantity 27). ' 'IndexOf(temp): 2 ' 'Remove(temp) 'Crank (quantity 27) was Removed. ' 'RemoveAt(0) 'Widget (quantity 400) was Removed. ' 'coweekly(1) = New OrderItem(...) 'Gear (quantity 175) was replaced by Gear, (quantity 1175). ' '110072675 27 Sprocket at 5.30 = 143.10 '110072684 1175 Gear at 5.17 = 6,074.75 ' 'The order list was cleared.
using System; using System.Collections.Generic; using System.Collections.ObjectModel; // This class derives from KeyedCollection and shows how to override // the protected ClearItems, InsertItem, RemoveItem, and SetItem // methods in order to change the behavior of the default Item // property and the Add, Clear, Insert, and Remove methods. The // class implements a Changed event, which is raised by all the // protected methods. // // SimpleOrder is a collection of OrderItem objects, and its key // is the PartNumber field of OrderItem. PartNumber is an Integer, // so SimpleOrder inherits KeyedCollection<int, OrderItem>. // (Note that the key of OrderItem cannot be changed; if it could // be changed, SimpleOrder would have to override ChangeItemKey.) // public class SimpleOrder : KeyedCollection<int, OrderItem> { public event EventHandler<SimpleOrderChangedEventArgs> Changed; // This parameterless constructor calls the base class constructor // that specifies a dictionary threshold of 0, so that the internal // dictionary is created as soon as an item is added to the // collection. // public SimpleOrder() : base(null, 0) {} // This is the only method that absolutely must be overridden, // because without it the KeyedCollection cannot extract the // keys from the items. // protected override int GetKeyForItem(OrderItem item) { // In this example, the key is the part number. return item.PartNumber; } protected override void InsertItem(int index, OrderItem newItem) { base.InsertItem(index, newItem); EventHandler<SimpleOrderChangedEventArgs> temp = Changed; if (temp != null) { temp(this, new SimpleOrderChangedEventArgs( ChangeType.Added, newItem, null)); } } protected override void SetItem(int index, OrderItem newItem) { OrderItem replaced = Items[index]; base.SetItem(index, newItem); EventHandler<SimpleOrderChangedEventArgs> temp = Changed; if (temp != null) { temp(this, new SimpleOrderChangedEventArgs( ChangeType.Replaced, replaced, newItem)); } } protected override void RemoveItem(int index) { OrderItem removedItem = Items[index]; base.RemoveItem(index); EventHandler<SimpleOrderChangedEventArgs> temp = Changed; if (temp != null) { temp(this, new SimpleOrderChangedEventArgs( ChangeType.Removed, removedItem, null)); } } protected override void ClearItems() { base.ClearItems(); EventHandler<SimpleOrderChangedEventArgs> temp = Changed; if (temp != null) { temp(this, new SimpleOrderChangedEventArgs( ChangeType.Cleared, null, null)); } } } // Event argument for the Changed event. // public class SimpleOrderChangedEventArgs : EventArgs { private OrderItem _changedItem; private ChangeType _changeType; private OrderItem _replacedWith; public OrderItem ChangedItem { get { return _changedItem; }} public ChangeType ChangeType { get { return _changeType; }} public OrderItem ReplacedWith { get { return _replacedWith; }} public SimpleOrderChangedEventArgs(ChangeType change, OrderItem item, OrderItem replacement) { _changeType = change; _changedItem = item; _replacedWith = replacement; } } public enum ChangeType { Added, Removed, Replaced, Cleared }; public class Demo { public static void Main() { SimpleOrder weekly = new SimpleOrder(); weekly.Changed += new EventHandler<SimpleOrderChangedEventArgs>(ChangedHandler); // The Add method, inherited from Collection, takes OrderItem. // weekly.Add(new OrderItem(110072674, "Widget", 400, 45.17)); weekly.Add(new OrderItem(110072675, "Sprocket", 27, 5.3)); weekly.Add(new OrderItem(101030411, "Motor", 10, 237.5)); weekly.Add(new OrderItem(110072684, "Gear", 175, 5.17)); Display(weekly); // The Contains method of KeyedCollection takes TKey. // Console.WriteLine("\nContains(101030411): {0}", weekly.Contains(101030411)); // The default Item property of KeyedCollection takes the key // type, Integer. The property is read-only. // Console.WriteLine("\nweekly[101030411].Description: {0}", weekly[101030411].Description); // The Remove method of KeyedCollection takes a key. // Console.WriteLine("\nRemove(101030411)"); weekly.Remove(101030411); // The Insert method, inherited from Collection, takes an // index and an OrderItem. // Console.WriteLine("\nInsert(2, new OrderItem(...))"); weekly.Insert(2, new OrderItem(111033401, "Nut", 10, .5)); // The default Item property is overloaded. One overload comes // from KeyedCollection<int, OrderItem>; that overload // is read-only, and takes Integer because it retrieves by key. // The other overload comes from Collection<OrderItem>, the // base class of KeyedCollection<int, OrderItem>; it // retrieves by index, so it also takes an Integer. The compiler // uses the most-derived overload, from KeyedCollection, so the // only way to access SimpleOrder by index is to cast it to // Collection<OrderItem>. Otherwise the index is interpreted // as a key, and KeyNotFoundException is thrown. // Collection<OrderItem> coweekly = weekly; Console.WriteLine("\ncoweekly[2].Description: {0}", coweekly[2].Description); Console.WriteLine("\ncoweekly[2] = new OrderItem(...)"); coweekly[2] = new OrderItem(127700026, "Crank", 27, 5.98); OrderItem temp = coweekly[2]; // The IndexOf method, inherited from Collection<OrderItem>, // takes an OrderItem instead of a key. // Console.WriteLine("\nIndexOf(temp): {0}", weekly.IndexOf(temp)); // The inherited Remove method also takes an OrderItem. // Console.WriteLine("\nRemove(temp)"); weekly.Remove(temp); Console.WriteLine("\nRemoveAt(0)"); weekly.RemoveAt(0); // Increase the quantity for a line item. Console.WriteLine("\ncoweekly(1) = New OrderItem(...)"); coweekly[1] = new OrderItem(coweekly[1].PartNumber, coweekly[1].Description, coweekly[1].Quantity + 1000, coweekly[1].UnitPrice); Display(weekly); Console.WriteLine(); weekly.Clear(); } private static void Display(SimpleOrder order) { Console.WriteLine(); foreach( OrderItem item in order ) { Console.WriteLine(item); } } private static void ChangedHandler(object source, SimpleOrderChangedEventArgs e) { OrderItem item = e.ChangedItem; if (e.ChangeType==ChangeType.Replaced) { OrderItem replacement = e.ReplacedWith; Console.WriteLine("{0} (quantity {1}) was replaced " + "by {2}, (quantity {3}).", item.Description, item.Quantity, replacement.Description, replacement.Quantity); } else if(e.ChangeType == ChangeType.Cleared) { Console.WriteLine("The order list was cleared."); } else { Console.WriteLine("{0} (quantity {1}) was {2}.", item.Description, item.Quantity, e.ChangeType); } } } // This class represents a simple line item in an order. All the // values are immutable except quantity. // public class OrderItem { private int _partNumber; private string _description; private double _unitPrice; private int _quantity; public int PartNumber { get { return _partNumber; }} public string Description { get { return _description; }} public double UnitPrice { get { return _unitPrice; }} public int Quantity { get { return _quantity; }} public OrderItem(int partNumber, string description, int quantity, double unitPrice) { _partNumber = partNumber; _description = description; _quantity = quantity; _unitPrice = unitPrice; } public override string ToString() { return String.Format( "{0,9} {1,6} {2,-12} at {3,8:#,###.00} = {4,10:###,###.00}", PartNumber, _quantity, Description, UnitPrice, UnitPrice * _quantity); } } /* This code example produces the following output: Widget (quantity 400) was Added. Sprocket (quantity 27) was Added. Motor (quantity 10) was Added. Gear (quantity 175) was Added. 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 101030411 10 Motor at 237.50 = 2,375.00 110072684 175 Gear at 5.17 = 904.75 Contains(101030411): True weekly[101030411].Description: Motor Remove(101030411) Motor (quantity 10) was Removed. Insert(2, new OrderItem(...)) Nut (quantity 10) was Added. coweekly[2].Description: Nut coweekly[2] = new OrderItem(...) Nut (quantity 10) was replaced by Crank, (quantity 27). IndexOf(temp): 2 Remove(temp) Crank (quantity 27) was Removed. RemoveAt(0) Widget (quantity 400) was Removed. coweekly(1) = New OrderItem(...) Gear (quantity 175) was replaced by Gear, (quantity 1175). 110072675 27 Sprocket at 5.30 = 143.10 110072684 1175 Gear at 5.17 = 6,074.75 The order list was cleared. */
using namespace System; using namespace System::Collections::Generic; using namespace System::Collections::ObjectModel; public enum class ChangeTypes { Added, Removed, Replaced, Cleared }; ref class SimpleOrderChangedEventArgs; // This class represents a simple line item in an order. All the // values are immutable except quantity. // public ref class OrderItem { private: int _quantity; public: initonly int PartNumber; initonly String^ Description; initonly double UnitPrice; OrderItem(int partNumber, String^ description, int quantity, double unitPrice) { this->PartNumber = partNumber; this->Description = description; this->Quantity = quantity; this->UnitPrice = unitPrice; }; property int Quantity { int get() { return _quantity; }; void set(int value) { if (value < 0) throw gcnew ArgumentException("Quantity cannot be negative."); _quantity = value; }; }; virtual String^ ToString() override { return String::Format( "{0,9} {1,6} {2,-12} at {3,8:#,###.00} = {4,10:###,###.00}", PartNumber, _quantity, Description, UnitPrice, UnitPrice * _quantity); }; }; // Event argument for the Changed event. // public ref class SimpleOrderChangedEventArgs : EventArgs { public: OrderItem^ ChangedItem; initonly ChangeTypes ChangeType; OrderItem^ ReplacedWith; SimpleOrderChangedEventArgs(ChangeTypes change, OrderItem^ item, OrderItem^ replacement) { this->ChangeType = change; this->ChangedItem = item; this->ReplacedWith = replacement; } }; // This class derives from KeyedCollection and shows how to override // the protected ClearItems, InsertItem, RemoveItem, and SetItem // methods in order to change the behavior of the default Item // property and the Add, Clear, Insert, and Remove methods. The // class implements a Changed event, which is raised by all the // protected methods. // // SimpleOrder is a collection of OrderItem objects, and its key // is the PartNumber field of OrderItem-> PartNumber is an Integer , // so SimpleOrder inherits KeyedCollection<int, OrderItem>. // (Note that the key of OrderItem cannot be changed; if it could // be changed, SimpleOrder would have to override ChangeItemKey.) // public ref class SimpleOrder : KeyedCollection<int, OrderItem^> { public: event EventHandler<SimpleOrderChangedEventArgs^>^ Changed; // This parameterless constructor calls the base class constructor // that specifies a dictionary threshold of 0, so that the internal // dictionary is created as soon as an item is added to the // collection. // SimpleOrder() : KeyedCollection<int, OrderItem^>(nullptr, 0) {}; // This is the only method that absolutely must be overridden, // because without it the KeyedCollection cannot extract the // keys from the items. // protected: virtual int GetKeyForItem(OrderItem^ item) override { // In this example, the key is the part number. return item->PartNumber; } virtual void InsertItem(int index, OrderItem^ newItem) override { __super::InsertItem(index, newItem); Changed(this, gcnew SimpleOrderChangedEventArgs( ChangeTypes::Added, newItem, nullptr)); } virtual void SetItem(int index, OrderItem^ newItem) override { OrderItem^ replaced = this->Items[index]; __super::SetItem(index, newItem); Changed(this, gcnew SimpleOrderChangedEventArgs( ChangeTypes::Replaced, replaced, newItem)); } virtual void RemoveItem(int index) override { OrderItem^ removedItem = Items[index]; __super::RemoveItem(index); Changed(this, gcnew SimpleOrderChangedEventArgs( ChangeTypes::Removed, removedItem, nullptr)); } virtual void ClearItems() override { __super::ClearItems(); Changed(this, gcnew SimpleOrderChangedEventArgs( ChangeTypes::Cleared, nullptr, nullptr)); } // This method uses the internal reference to the dictionary // to test fo public: void AddOrMerge(OrderItem^ newItem) { int key = this->GetKeyForItem(newItem); OrderItem^ existingItem = nullptr; // The dictionary is not created until the first item is // added, so it is necessary to test for null. Using // AndAlso ensures that TryGetValue is not called if the // dictionary does not exist. // if (this->Dictionary != nullptr && this->Dictionary->TryGetValue(key, existingItem)) { existingItem->Quantity += newItem->Quantity; } else { this->Add(newItem); } } }; public ref class Demo { public: static void Main() { SimpleOrder^ weekly = gcnew SimpleOrder(); weekly->Changed += gcnew EventHandler<SimpleOrderChangedEventArgs^>(ChangedHandler); // The Add method, inherited from Collection, takes OrderItem-> // weekly->Add(gcnew OrderItem(110072674, "Widget", 400, 45.17)); weekly->Add(gcnew OrderItem(110072675, "Sprocket", 27, 5.3)); weekly->Add(gcnew OrderItem(101030411, "Motor", 10, 237.5)); weekly->Add(gcnew OrderItem(110072684, "Gear", 175, 5.17)); Display(weekly); // The Contains method of KeyedCollection takes TKey. // Console::WriteLine("\nContains(101030411): {0}", weekly->Contains(101030411)); // The default Item property of KeyedCollection takes the key // type, Integer. The property is read-only. // Console::WriteLine("\nweekly[101030411]->Description: {0}", weekly[101030411]->Description); // The Remove method of KeyedCollection takes a key. // Console::WriteLine("\nRemove(101030411)"); weekly->Remove(101030411); // The Insert method, inherited from Collection, takes an // index and an OrderItem. // Console::WriteLine("\nInsert(2, gcnew OrderItem(...))"); weekly->Insert(2, gcnew OrderItem(111033401, "Nut", 10, .5)); // The default Item property is overloaded. One overload comes // from KeyedCollection<int, OrderItem>; that overload // is read-only, and takes Integer because it retrieves by key. // The other overload comes from Collection<OrderItem>, the // base class of KeyedCollection<int, OrderItem>; it // retrieves by index, so it also takes an Integer. The compiler // uses the most-derived overload, from KeyedCollection, so the // only way to access SimpleOrder by index is to cast it to // Collection<OrderItem>. Otherwise the index is interpreted // as a key, and KeyNotFoundException is thrown. // Collection<OrderItem^>^ coweekly = weekly; Console::WriteLine("\ncoweekly[2].Description: {0}", coweekly[2]->Description); Console::WriteLine("\ncoweekly[2] = gcnew OrderItem(...)"); coweekly[2] = gcnew OrderItem(127700026, "Crank", 27, 5.98); OrderItem^ temp = coweekly[2]; // The IndexOf method, inherited from Collection<OrderItem>, // takes an OrderItem instead of a key. // Console::WriteLine("\nIndexOf(temp): {0}", weekly->IndexOf(temp)); // The inherited Remove method also takes an OrderItem-> // Console::WriteLine("\nRemove(temp)"); weekly->Remove(temp); Console::WriteLine("\nRemoveAt(0)"); weekly->RemoveAt(0); weekly->AddOrMerge(gcnew OrderItem(110072684, "Gear", 1000, 5.17)); Display(weekly); Console::WriteLine(); weekly->Clear(); } private: static void Display(SimpleOrder^ order) { Console::WriteLine(); for each( OrderItem^ item in order ) { Console::WriteLine(item); } } static void ChangedHandler(Object^ source, SimpleOrderChangedEventArgs^ e) { OrderItem^ item = e->ChangedItem; if (e->ChangeType == ChangeTypes::Replaced) { OrderItem^ replacement = e->ReplacedWith; Console::WriteLine("{0} (quantity {1}) was replaced " + "by {2}, (quantity {3}).", item->Description, item->Quantity, replacement->Description, replacement->Quantity); } else if(e->ChangeType == ChangeTypes::Cleared) { Console::WriteLine("The order list was cleared."); } else { Console::WriteLine("{0} (quantity {1}) was {2}.", item->Description, item->Quantity, e->ChangeType); } } }; void main() { Demo::Main(); } /* This code example produces the following output: Widget (quantity 400) was Added. Sprocket (quantity 27) was Added. Motor (quantity 10) was Added. Gear (quantity 175) was Added. 110072674 400 Widget at 45.17 = 18,068.00 110072675 27 Sprocket at 5.30 = 143.10 101030411 10 Motor at 237.50 = 2,375.00 110072684 175 Gear at 5.17 = 904.75 Contains(101030411): True weekly[101030411]->Description: Motor Remove(101030411) Motor (quantity 10) was Removed. Insert(2, gcnew OrderItem(...)) Nut (quantity 10) was Added. coweekly[2].Description: Nut coweekly[2] = gcnew OrderItem(...) Nut (quantity 10) was replaced by Crank, (quantity 27). IndexOf(temp): 2 Remove(temp) Crank (quantity 27) was Removed. RemoveAt(0) Widget (quantity 400) was Removed. 110072675 27 Sprocket at 5.30 = 143.10 110072684 1175 Gear at 5.17 = 6,074.75 The order list was cleared. */

System.Collections.ObjectModel.Collection
System.Collections.ObjectModel.KeyedCollection


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 プロパティ

名前 | 説明 | |
---|---|---|
![]() | Count | Collection に実際に格納されている要素の数を取得します。 ( Collection から継承されます。) |
![]() | Item | オーバーロードされます。 指定したキーを持つ要素を取得します。 |

名前 | 説明 | |
---|---|---|
![]() | Items | Collection をラップする List ラッパーを取得します。 ( Collection から継承されます。) |

KeyedCollection メソッド

名前 | 説明 | |
---|---|---|
![]() | Add | Collection の末尾にオブジェクトを追加します。 ( Collection から継承されます。) |
![]() | Clear | Collection からすべての要素を削除します。 ( Collection から継承されます。) |
![]() | Contains | 指定したキーの要素がコレクションに含まれているかどうかを確認します。 |
![]() | CopyTo | Collection 全体を互換性のある 1 次元の Array にコピーします。コピー操作は、コピー先の配列の指定したインデックスから始まります。 ( Collection から継承されます。) |
![]() | Equals | オーバーロードされます。 2 つの Object インスタンスが等しいかどうかを判断します。 ( Object から継承されます。) |
![]() | GetEnumerator | Collection を反復処理する列挙子を返します。 ( Collection から継承されます。) |
![]() | GetHashCode | 特定の型のハッシュ関数として機能します。GetHashCode は、ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用に適しています。 ( Object から継承されます。) |
![]() | GetType | 現在のインスタンスの Type を取得します。 ( Object から継承されます。) |
![]() | IndexOf | 指定したオブジェクトを検索し、Collection 全体内で最初に見つかった位置の 0 から始まるインデックスを返します。 ( Collection から継承されます。) |
![]() | Insert | Collection 内の指定したインデックスの位置に要素を挿入します。 ( Collection から継承されます。) |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 ( Object から継承されます。) |
![]() | Remove | 指定したキーを持つ要素を KeyedCollection から削除します。 |
![]() | RemoveAt | Collection の指定したインデックスにある要素を削除します。 ( Collection から継承されます。) |
![]() | ToString | 現在の Object を表す String を返します。 ( Object から継承されます。) |

名前 | 説明 | |
---|---|---|
![]() | ChangeItemKey | 検索ディクショナリの指定した要素に関連付けられたキーを変更します。 |
![]() | ClearItems | オーバーライドされます。 KeyedCollection からすべての要素を削除します。 |
![]() | Finalize | Object がガベージ コレクションにより収集される前に、その Object がリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 ( Object から継承されます。) |
![]() | GetKeyForItem | 派生クラスで実装された場合、指定した要素からキーを抽出します。 |
![]() | InsertItem | オーバーロードされます。 KeyedCollection 内の指定したインデックスの位置に要素を挿入します。 |
![]() | MemberwiseClone | 現在の Object の簡易コピーを作成します。 ( Object から継承されます。) |
![]() | RemoveItem | オーバーライドされます。 KeyedCollection の指定したインデックスにある要素を削除します。 |
![]() | SetItem | オーバーロードされます。 指定したインデックス位置の項目を、指定した項目で置き換えます。 |

KeyedCollection メンバ
キーが値に埋め込まれているコレクションの抽象基本クラスを提供します。
KeyedCollection ジェネリック型で公開されるメンバを以下の表に示します。


名前 | 説明 | |
---|---|---|
![]() | Count | Collection に実際に格納されている要素の数を取得します。(Collection から継承されます。) |
![]() | Item | オーバーロードされます。 指定したキーを持つ要素を取得します。 |

名前 | 説明 | |
---|---|---|
![]() | Items | Collection をラップする List ラッパーを取得します。(Collection から継承されます。) |

名前 | 説明 | |
---|---|---|
![]() | Add | Collection の末尾にオブジェクトを追加します。 (Collection から継承されます。) |
![]() | Clear | Collection からすべての要素を削除します。 (Collection から継承されます。) |
![]() | Contains | 指定したキーの要素がコレクションに含まれているかどうかを確認します。 |
![]() | CopyTo | Collection 全体を互換性のある 1 次元の Array にコピーします。コピー操作は、コピー先の配列の指定したインデックスから始まります。 (Collection から継承されます。) |
![]() | Equals | オーバーロードされます。 2 つの Object インスタンスが等しいかどうかを判断します。 (Object から継承されます。) |
![]() | GetEnumerator | Collection を反復処理する列挙子を返します。 (Collection から継承されます。) |
![]() | GetHashCode | 特定の型のハッシュ関数として機能します。GetHashCode は、ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用に適しています。 (Object から継承されます。) |
![]() | GetType | 現在のインスタンスの Type を取得します。 (Object から継承されます。) |
![]() | IndexOf | 指定したオブジェクトを検索し、Collection 全体内で最初に見つかった位置の 0 から始まるインデックスを返します。 (Collection から継承されます。) |
![]() | Insert | Collection 内の指定したインデックスの位置に要素を挿入します。 (Collection から継承されます。) |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 (Object から継承されます。) |
![]() | Remove | 指定したキーを持つ要素を KeyedCollection から削除します。 |
![]() | RemoveAt | Collection の指定したインデックスにある要素を削除します。 (Collection から継承されます。) |
![]() | ToString | 現在の Object を表す String を返します。 (Object から継承されます。) |

名前 | 説明 | |
---|---|---|
![]() | ChangeItemKey | 検索ディクショナリの指定した要素に関連付けられたキーを変更します。 |
![]() | ClearItems | オーバーライドされます。 KeyedCollection からすべての要素を削除します。 |
![]() | Finalize | Object がガベージ コレクションにより収集される前に、その Object がリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。) |
![]() | GetKeyForItem | 派生クラスで実装された場合、指定した要素からキーを抽出します。 |
![]() | InsertItem | オーバーロードされます。 KeyedCollection 内の指定したインデックスの位置に要素を挿入します。 |
![]() | MemberwiseClone | 現在の Object の簡易コピーを作成します。 (Object から継承されます。) |
![]() | RemoveItem | オーバーライドされます。 KeyedCollection の指定したインデックスにある要素を削除します。 |
![]() | SetItem | オーバーロードされます。 指定したインデックス位置の項目を、指定した項目で置き換えます。 |

Weblioに収録されているすべての辞書からKeyedCollectionを検索する場合は、下記のリンクをクリックしてください。

- KeyedCollectionのページへのリンク