Как вставить элемент в первый индекс в словаре?

Есть ли метод или метод, который позволяет вставить элемент в Dictionary гарантирующий, что элемент находится в первом индексе KeyCollection этого словаря.

Например:

 Dictionary dic = foo.GetOutput(); // `dic` is something like: // {"foo", "baa"}, // {"a", "b"} 

Мне нужно что-то вроде:

 dic.Add("key", "value", 0); // where `0` is the index that `key` to be inserted. foreach(KeyValuePair key in dic) { Console.WriteLine("{0} = {1}", key.Key, key.Value); } 

Выход:

 key = value foo = baa a = b 

Любая помощь очень ценится. Заранее спасибо!

Не используя словарь.

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

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

Если вы заказываете то, что вас волнует больше всего, тогда вы вообще не хотите pureictionary. Скорее вы хотите либо List> либо хотите структуру, которая предлагает как функциональность списка, так и словаря, предоставляемого OrderedDictionary . Это не является общим, но вы можете легко создать общую оболочку вокруг него (не дает преимуществ производительности, связанных с использованием дженериков, но при этом допускает использование типов).

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

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

 List> list = dic.ToList(); list.Insert(0, new KeyValuePair("a", "b")); foreach(KeyValuePair pair in list) Console.WriteLine("{0} = {1}", pair.Key, pair.Value); 

Я знаю, что это трехлетний вопрос. Но нашел обходной путь этой проблемы . Это может помочь кому-то

 Dictionary dic = foo.GetOutput(); dic = (new Dictionary {{"key","value"}}).Concat(dic).ToDictionary(k => k.Key, v => v.Value); 

Это добавит элемент в начало словаря 🙂

Это невозможно с помощью Dictionary поскольку он перечисляет значения неупорядоченным образом при перечислении. Существует SortedDictionary который обеспечивает упорядочение, но он делает это, используя IComparer против значения ключа. Здесь вы хотите, чтобы ключ был String и упорядочивался на основе int . Это невозможно с любым из этих типов.

Я думаю, вам нужно будет внедрить новый тип с этими очень специфическими семантиками. Например.

 class OrderedMap { private readonly Dictionary _map = new Dictionary(); private readonly List _list = new List(); public void Add(TKey key, TValue value) { if (!_map.ContainsKey(key)) { _list.Add(key); } _map[key] = value; } public void Add(TKey key, TValue value, int index) { if (_map.ContainsKey(key)) { _list.Remove(key); } _map[key] = value; _list.Insert(index, key); } public TValue GetValue(TKey key) { return _map[key]; } public IEnumerabe> GetItems() { foreach (var key in _list) { var value = _map[key]; yield return new KeyValuePair(key, value); } } } 

Обратите внимание, что это Dictionary с некоторыми нетривиальными различиями в производительности над традиционным Dictionary . Например, Add and Remove работают медленнее.

Dictionary по своей сути неупорядочен (или, скорее, порядок непредсказуем и на него нельзя положиться). Если вам нужен какой-то заказ, вам нужно использовать другой тип. Трудно рекомендовать какой-либо конкретный тип, не зная больше о ваших требованиях.

Dictionary не может быть заказан.

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

Класс Dictionary не содержит элементы упорядоченным образом, поэтому нет «первого» элемента.

Существует SortedDictionary (.NET 4.0+), который сортируется по ключу, но опять же, это очень смутное представление о «первом».

Dictionary – это неупорядоченная коллекция. Вы можете попробовать OrderedDictionaryhttp://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx – который имеет метод Insert() который является тем, что вам нужно.

это мое решение, может быть, не лучшее решение, но оно работает. знак равно

 public static ComboBox FillDropDownList(Dictionary dictionary, ComboBox dropDown, String selecione) { var d = new SortedDictionary(); d.Add("0", selecione); foreach (KeyValuePair pair in dictionary) { d.Add(pair.Key, pair.Value); } dropDown.DataSource = new BindingSource(d, null); dropDown.DisplayMember = "Value"; dropDown.ValueMember = "Key"; dropDown.SelectedIndex = 0; return dropDown; }