«Словарь» с ключом как часть хранимых элементов? - PullRequest
4 голосов
/ 16 сентября 2010

Похоже, я забыл имя типа ... Что-то в моей голове постоянно говорит мне, что я наткнулся на Словарь, который в основном использует определяемый пользователем Comparer для поиска. Но я почему-то больше не могу найти этот класс в недрах .Net.

Поскольку я понятия не имею, как описать то, что я ищу, без описания возможной реализации, я также приведу пример того, что я не хочу делать.

Я в основном ищу способ добиться следующего (псевдокод):

class CustomId
{
   // [...]
}
class Element
{
   CustomId id;
}
Container<CustomId, Element> myContainer = new Container(myCustomComparer)
myContainer.Add(new Element()) // No key specified
myElement = myContainer[new CustomId(...)]; // Retrieval with custom id

Возможно, это технически не совсем словарь, но я надеюсь, что идея ясна. В основном ключ является частью хранимого элемента.

Ответы [ 3 ]

12 голосов
/ 16 сентября 2010

Я думаю, что вы ищете KeyedCollection<TKey, TItem>.Создайте класс, который наследуется от этого класса, и переопределите метод GetKeyForItem().

2 голосов
/ 16 сентября 2010

Это на самом деле довольно легко.вам просто нужно наследовать от KeyedCollection<TKey, TItem>:

public class ElementCollection : KeyedCollection<CustomId, Element>
{
    public override CustomId GetKeyForItem(Element element)
    {
        return element.id;
    }
}
0 голосов
/ 16 сентября 2010

Вы можете сделать пару вещей:

Используйте простой список и используйте Linq для извлечения объектов по CustomID:

var elements = myContainer.Where(e=>e.CustomID == new CustomID(...)).ToList();

Или расширьте универсальный класс Dictionary, чтобы обеспечить перегрузку Add, которая знает, как проецировать ключ из заданного значения:

public class AutoDictionary<K,V> : Dictionary<K,V>
{
   public Func<V,K> KeyGenerator { get; set; }
   public void Add(V value)
   {
      Add(KeyGenerator(V),V);
   }
}

...

var myContainer = new AutoDictionary<CustomId, Element>();
myContainer.KeyGenerator = e=> e.id;
myContainer.Add(myElement);
var elementFromDictionary = myContainer[myElement.id]; //will be the same instance as myElement
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...