I want to use a KeyedCollection to store a class against a string key value. I have the following code:
public class MyClass
{
public string Key;
public string Test;
}
public class MyCollection : KeyedCollection<string, MyClass>
{
public MyCollection() : base()
{
}
protected override String GetKeyForItem(MyClass cls)
{
return cls.Key;
}
}
class Program
{
static void Main(string[] args)
{
MyCollection col = new MyCollection();
col.Add(new MyClass()); // Here is want to specify the string Key Value
}
}
Can anyone tell me what I’m doing wrong here? Where do I specify the key value so that I can retrieve by it?
Your GetKeyForItem
override is what specifies the key for an item. From the docs:
Unlike dictionaries, an element of
KeyedCollection
is not a key/value pair; instead, the entire element is the value and the key is embedded within the value. For example, an element of a collection derived fromKeyedCollection<String,String>
might be "John Doe Jr." where the value is "John Doe Jr." and the key is "Doe"; or a collection of employee records containing integer keys could be derived fromKeyedCollection<int,Employee>. The abstract
GetKeyForItem` method extracts the key from the element.
So in order for the item to be keyed correctly, you should set its Key
property before adding it to the collection:
MyCollection col = new MyCollection();
MyClass myClass = new MyClass();
myClass.Key = "This is the key for this object";
col.Add(myClass);