Правильное добавление в Dictionary

344
03 сентября 2017, 00:39

Есть Dictionary :

public Dictionary<int, OrderModel> x = new Dictionary<int, OrderModel>();

Есть OrderModel :

public class OrderModel
{
    public int? Id { get; set; }
    public int OrderStatusId { get; set; }
    public int MenuId { get; set; }
    public ICollection<DishModel> Dishes { get; set; }
}

У пользователя есть список товаров. Модель вот:

public class DishModel
{
    public int ProvisionerId {get;set;}
}

У каждого товара есть свой button.

По нажатию на этот button происходит следующее :

 //OrderModel этого товара отправляется в Dictionary, где происходит проверка
 public void method(DishModel dishModel){
  //Если элемент Dictionary по ключу dishModel.ProvisionerId не пустой, то засунь в него элемент типа OrderModel)
 if (x.TryGetValue(dishModel.ProvisionerId, out OrderModel checkForNull))
    {
      beforSerializeForProvisioners[dishModel.ProvisionerId] = OrderModel;
    }
  //Иначе если элемента Dictionary с таким ключом нет, то создай его.
 else
    {
   beforSerializeForProvisioners.Add(dishModel.ProvisionerId, OrderModel);
    }
}

В чем моя проблема :

Каждый товар имеет своего поставщика.

Поставщиков n-количество.

Получить это количество можно.

И нужно сделать так :

 Если товар имеет поставщика 1, то пусть он сохранится в Dictionary с ключом 1
 Иначе если товар имеет поставщика 2, то пусть он сохранится в Dictionary с ключом 2
 ...и т.д.

Но проблема такая :

 Когда пользователь нажал на товар, допустим с поставщиком 1, то он успешно создал Dictionary[1] и дал этому ключу значение.
 Если ещё нажать на ещё один товар этого же поставщика, то всё успешно повторится.
 Но если нажать на товар от другого поставщика, то происходит какая-то магия.
Он в Dictionary[1] добавляет этот товар от другого поставщика.
Он создает Dictionary[2] и туда также добавляет этот товар.

Решений было 2.

1. Как-то правильно организовать добавление. Но у меня MVVM-паттерн, так что придется слишком многое выкладывать и адаптировать, чтобы была соблюдена конфиденциальность.
2. Перебрать весь Dictionary и его значения. 

Склоняюсь больше ко второму варианту.

Следовательно, нужно сделать так :

Provisioners x = new Provisioners();
for(int i=0;i<x.Count();i++){
  foreach(DishModel y in Dictionary[x[i]]){
   if(y.ProvisionerId != Dictionary[x[i]].Dishes.ToList()[0].ProvisionerId) 
   {
      Dictionary[x[i]].Dishes.Remove(y);
    }
}

Но когда происходит Remove();

VisualStudio2017 ругается, что массив Dictionary.Dishes был модифицирован и работа foreach прекращена.

Я понимаю почему она прекращена. Но как лучше удалить элементы с другим поставщиком?

Ключом в Dictionary является Id поставщика.

Answer 1

Отвечая на заданный вопрос: ты можешь либо перейти к ConcurrentDictionary, который позволяет одновременно итерироваться по коллекции и модифицировать её (но для однопоточного кода это костыль, рожденный путём наименьшего сопротивления).

Либо ты должен скопировать ключи одного словаря во временный массив вызвав dic.Keys.ToArray(), и в цикле бежать по этому массиву, извлекая и удаляя элементы из основного Dictionary по известным ключам.

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

READ ALSO
Ошибка при компиляции С# проекта в IDE Rider на Ubuntu

Ошибка при компиляции С# проекта в IDE Rider на Ubuntu

Использую фреймворк для кросс-платформенных программ EtoForms

379
Как получить список из двух JSON объектов

Как получить список из двух JSON объектов

Здравствуйте, подскажите пожалуйста, у меня есть два JSON объекта

603
listbox переместить выделение на последний элемент

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

Необходимо сделать пролистывание ListBox в самый низДелаю при инициализации окна:

332