Добавление и получение из коллекции KeyedCollection - PullRequest
3 голосов
/ 30 июня 2010

Я хочу использовать KeyedCollection для хранения класса со значением строкового ключа. У меня есть следующий код:

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
    }
}

Может кто-нибудь сказать мне, что я здесь делаю неправильно? Где указать значение ключа, чтобы его можно было извлечь по нему?

Ответы [ 3 ]

8 голосов
/ 30 июня 2010

Ваше GetKeyForItem переопределение - это то, что определяет ключ для элемента. Из документов:

В отличие от словарей, элемент KeyedCollection не является парой ключ / значение; вместо этого весь элемент является значением, а ключ встроен в значение. Например, элементом коллекции, производной от KeyedCollection<String,String>, может быть «Джон Доу-младший». где значение "Джон Доу-младший" и ключ "Доу"; или набор записей сотрудников, содержащий целочисленные ключи, может быть получен из метода KeyedCollection<int,Employee>. The abstract GetKeyForItem`, извлекающего ключ из элемента.

Таким образом, для правильного ввода элемента необходимо установить его Key свойство до , добавив его в коллекцию:

MyCollection col = new MyCollection();
MyClass myClass = new MyClass();
myClass.Key = "This is the key for this object";
col.Add(myClass); 
1 голос
/ 30 июня 2010

KeyedCollection является базовым классом для создания наборов ключей, поэтому вам нужно реализовать немало всего.

Возможно, использование Dictionary будет проще и быстрее работать с

0 голосов
/ 30 июня 2010

Я знаю, что это немного по-другому, но вы рассматривали возможность применения индексатора .

public string this[string index]
{
    get { 
      // put get code here
    }
    set {
      // put set code here.
    }
}
...