Встроенный список, к которому можно получить доступ по индексу и ключу - PullRequest
3 голосов
/ 18 ноября 2008

Можно ли создать список, к которому можно получить доступ по индексу или по ключу?

Я ищу тип Collection, который уже существует, но имеет эту возможность, я хочу избежать переопределения индексаторов

Ответы [ 5 ]

4 голосов
/ 18 ноября 2008

Существующие ответы уже показывают, как добавить свои собственные индексаторы.

Возможно, вы захотите взглянуть на некоторые из существующих коллекций на основе ключей, например, SortedList<,>, которые действуют аналогично Dictionary<,>, но допускают использование индексатора ключа и позиции.

Также - вы должны быть в состоянии использовать наследование для большинства вещей такого типа - например, наследование от Collection<> или List<>. Обратите внимание, что если ваша коллекция реализует IList / IList<T>, я не рекомендую следующее (что я иногда вижу):

public SomeType this[int someId] {...}

Дело в том, что люди ожидают, что целочисленный индексатор IList[<T>] будет позиционным.

2 голосов
/ 18 ноября 2008

Есть похожий вопрос на Какова лучшая структура данных в .NET для поиска по строковому ключу или числовому индексу? .

Посмотрите на KeyedCollection :

class IndexableDictionary<TKey, TItem> : KeyedCollection<TKey, TItem>
 { Dictionary<TItem, TKey> keys = new Dictionary<TItem, TKey>();

   protected override TKey GetKeyForItem(TItem item) { return keys[item];}

   public void Add(TKey key, TItem item) 
    { keys[item] = key;
      this.Add(item);
    }
 }
2 голосов
/ 18 ноября 2008

System.Collections.Specialized.NameValueCollection может сделать это, но может хранить только строки в качестве значений.

    System.Collections.Specialized.NameValueCollection k = 
        new System.Collections.Specialized.NameValueCollection();

    k.Add("B", "Brown");
    k.Add("G", "Green");

    Console.WriteLine(k[0]);    // Writes Brown
    Console.WriteLine(k["G"]);  // Writes Green
1 голос
/ 18 ноября 2008
public object this[int index]
{
    get { ... }
    set { ... }
}

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

public object this[String key]
{
    get { ... }
    set { ... }
}

Если вы не хотите определять свою собственную коллекцию, просто наследуйте от List<T> или просто используйте переменную типа List<T>.

0 голосов
/ 18 ноября 2008

Вы можете добавить индексатор, добавив в вашу коллекцию следующее свойство:

public object this[int index]
{
    get { /* return the specified index here */ }
    set { /* set the specified index to value here */ }
}

Это можно быстро добавить в Visual Studio, набрав indexer и нажав [tab] [tab].

Тип возвращаемого значения и тип индексатора могут быть изменены. Вы также можете добавить несколько типов индексаторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...