Как добавить элемент в конец коллекции Dictionary<String, MyClass>?

107
18 января 2020, 01:40

Столкнулся с одной проблемой. Есть свойство (коллекция) Dictionary<String, MyClass> MyDic и периодически запускается метод AddValues(), который добавляет в нее элементы. Самый первый раз элементы добавляются по порядку, но последующие разы - добавляются в самое начало. У меня два вопроса - почему не добавляются элементы в конец коллекции и можно ли как-то решить эту проблему?

Answer 1

Элементы не добавляются в конец, потому что класс Dictionary<TKey, TValue> реализован как хэш-таблица. Порядок элементов в хэш-таблице может быть произвольным.

Чтобы управлять порядком элементов, используйте класс SordtedDictionary<TKey, TValue>. Он реализован на базе сбалансированного двоичного дерева.

Имейте в виде, что операции вставки, удаления и поиска элемента по ключу в двоичном дереве имеют сложность O(log N) против O(1) у хэш-таблицы.

Answer 2

Пример как скрестить 2 коллекции

public class MyAwesomeCollection<TK, TV> : IEnumerable<KeyValuePair<TK, TV>>
{
    private List<TK> _listItems = new List<TK>();
    private Dictionary<TK, TV> _dictItems = new Dictionary<TK, TV>();

    public IEnumerator<KeyValuePair<TK, TV>> GetEnumerator()
    {
        return _listItems.Select(x=> new KeyValuePair<TK, TV>(x,_dictItems[x])).GetEnumerator();
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
    public void AddToEnd(TK key, TV value)
    {
        if (_dictItems.ContainsKey(key))
        {
            _dictItems[key] = value;
            _listItems.Remove(key);
            _listItems.Add(key);
        }
        else 
        {   _dictItems[key] = value;
            _listItems.Add(key);
        }
    }
    public void CLear()
    {
        _dictItems.Clear();
        _listItems.Clear();
    }
}

Как использовать

var coll = new MyAwesomeCollection<int,int>();
for(int i = 0; i<10; i++)
{
    coll.AddToEnd(i, i+i);      
}
READ ALSO
Как сделать так, чтобы при движении одного объекта на другой он не пересек его?

Как сделать так, чтобы при движении одного объекта на другой он не пересек его?

Есть два объекта, рисуемые на форме (на пример, круг и треугольник) и необходимо при движение (движение происходит при нажатии стрелок на клавиатуре)...

118
Очень странное поведение OleDbDataReader

Очень странное поведение OleDbDataReader

Всем доброго дня! Сразу суть вопроса - запрос в коде не отрабатывается верно - не приходят данные, проблема только с полем WWG_NAME, остальные...

127
Открыть новое окно/вкладку с новым пользователем

Открыть новое окно/вкладку с новым пользователем

В автотесте Есть адрес: https://flowtimeqapnmsoftlabs

110