Можно ли создать список, к которому можно получить доступ по индексу или ключу?
Я ищу тип коллекции, который уже существует, но имеет эту возможность, я хочу избежать переопределения индексаторов
Когда вы говорите «создать», хотите ли вы создать новый тип Коллекции с этой возможностью, или вы ищете тип Коллекции, который уже существует, но имеет такую возможность?





Вы можете добавить индексатор, добавив в свою коллекцию следующее свойство:
public object this[int index]
{
get { /* return the specified index here */ }
set { /* set the specified index to value here */ }
}
Это можно быстро добавить в Visual Studio, набрав индексатор и нажав [tab] [tab].
Тип возвращаемого значения и тип индексатора можно, конечно, изменить. Вы также можете добавить несколько типов индексаторов.
public object this[int index]
{
get { ... }
set { ... }
}
Помимо целочисленного индекса, вы можете предоставить ключ любого другого типа, который вам нравится.
public object this[String key]
{
get { ... }
set { ... }
}
Если вы не хотите определять свою собственную коллекцию, просто наследуйте от List<T> или просто используйте переменную типа List<T>.
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
В существующих ответах уже показано, как добавлять собственные индексаторы.
Возможно, вы захотите взглянуть на некоторые из существующих коллекций на основе ключей, такие как SortedList<,>, который действует аналогично Dictionary<,>, но позволяет использовать индексатор ключей и позиций.
Кроме того, вы должны иметь возможность использовать наследование для многих вещей этого типа - например, наследование от Collection<> или List<>. Обратите внимание, что если ваша коллекция реализует IList / IList<T>, я не рекомендую следующее (что я иногда вижу):
public SomeType this[int someId] {...}
Дело в том, что люди ожидают, что целочисленный индексатор IList[<T>] будет позиционным.
Аналогичный вопрос есть на Какая структура данных в .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);
}
}
Определите индекс и ключ. Опубликуйте синтаксис, который хотите написать.