Как я могу перебрать список Xamarin.Forms.Maps Map.Pins при изменении списка? - PullRequest
0 голосов
/ 15 апреля 2020

Я работаю над приложением 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

Заранее большое спасибо

1 Ответ

1 голос
/ 15 апреля 2020

Чтобы метод for l oop работал, вам нужно сосчитать в обратном направлении, иначе ваш индекс будет сбрасываться при каждом удалении элемента.

...