Есть 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 поставщика.
Отвечая на заданный вопрос: ты можешь либо перейти к ConcurrentDictionary, который позволяет одновременно итерироваться по коллекции и модифицировать её (но для однопоточного кода это костыль, рожденный путём наименьшего сопротивления).
Либо ты должен скопировать ключи одного словаря во временный массив вызвав dic.Keys.ToArray()
, и в цикле бежать по этому массиву, извлекая и удаляя элементы из основного Dictionary по известным ключам.
Но вместо того, чтобы подпирать код костылями, стоит разобраться - почему у тебя элементы попадают в чужой Dictionary.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Использую фреймворк для кросс-платформенных программ EtoForms
Здравствуйте, подскажите пожалуйста, у меня есть два JSON объекта
Необходимо сделать пролистывание ListBox в самый низДелаю при инициализации окна:
Update: Самым быстрым оказался алгоритм V7