Я работаю над приложением Xamarin.Forms, использующим пакет Maps. Объект Map содержит контакты IList, в которых хранится список объектов Pin, содержащих метку, положение и другие свойства. Я пытаюсь обновить этот список контактов, сравнивая их Положение с коллекцией пользовательских объектов, которые содержат те же свойства (ID, Положение и т. Д. 1030 *), а также с тем, существуют ли они в этом списке или нет, и удаляя их соответствующим образом. .
Чтобы уточнить, при каждом обновлении я хочу перебирать список контактов, удалять все контакты, которые больше не соответствуют объекту в коллекции, добавлять любые контакты, которые соответствуют новым объектам в коллекции, и измените положения любых выводов, где изменилось положение соответствующего объекта.
Я пытаюсь сделать это, перебирая выводы и сравнивая их соответственно, удаляя, добавляя и изменяя выводы при необходимости. Проблема в том, что я получаю следующую ошибку при каждом удалении Пина:
An exception of type 'System.InvalidOperationException' occurred in mscorlib.dll but was not handled in user code
Collection was modified; enumeration operation may not execute.
Этого следует ожидать при изменении списка, который повторяется, однако все решения доступны для обхода. это, например, использование Maps.Pins.ToList () при создании экземпляра foreach l oop, использование for для l oop вместо foreach l oop или даже создание копии списка Pins для повторения во время модифицируя оригинал, не решайте эту проблему.
Я знаю, что некоторые из этих решений работают, потому что я использовал их для преодоления этой проблемы при сравнении списков моих пользовательских объектов, но по какой-то причине ни один из них похоже, работает со списком Map.Pins. Может кто-нибудь указать, что я могу делать неправильно, или есть какие-то подробности о списке Map.Pins, который исключает его из этих решений? Есть ли другой способ решить эту проблему?
Для справки, в коде я попытался реализовать функцию «удалить булавки, которые больше не должны существовать»:
.ToList ()
foreach (Pin pin in map.Pins.ToList())
{
if (!newList.Any(x => x.ID == pin.Label))
{
Debug.WriteLine("Pin " + pin.Label + " is being removed.");
map.Pins.Remove(pin);
}
}
Для L oop
for (int i = 0; i < map.Pins.Count; i++) {
Debug.WriteLine(map.Pins[i].Label);
if (!newList.Any(x => x.ID == map.Pins[i].Label))
{
Debug.WriteLine("Pin " + map.Pins[i].Label + " is being removed.");
map.Pins.Remove(map.Pins[i]);
}
}
Создание нового списка
List<Pin> oldPins = new List<Pin>();
foreach (Pin pin in map.Pins)
{
oldPins.Add(pin);
}
foreach (Pin pin in oldPins)
{
if (!newList.Any(x => x.ID == pin.Label))
{
Debug.WriteLine("Pin " + pin.Label + " is being removed.");
map.Pins.Remove(pin);
}
}
// I tried this with the for loop solution as well
Заранее большое спасибо