Search code examples
c#collectionskeyedcollection

Adding and retrieving from a KeyedCollection


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?


Solution

  • 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 from KeyedCollection<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 from KeyedCollection<int,Employee>. The abstractGetKeyForItem` 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);