簡體   English   中英

如何在修改列表時迭代 Xamarin.Forms.Maps Map.Pins 列表?

[英]How can I iterate over a Xamarin.Forms.Maps Map.Pins list while modifying the list?

我正在開發一個 Xamarin.Forms 應用程序,它使用地圖 package。 Map object 包含一個 IList Pins,其中存儲包含 Label、Z52F5E0BC3859BCE5F85881E25 和其他屬性的 Pin 對象列表我試圖通過將它們的 Position 與包含相同屬性(ID、Position 等)的自定義對象的集合進行比較來更新此引腳列表,以及它們是否存在於此列表中,並相應地刪除它們。

為了詳細說明,每次更新時,我都想遍歷 Pins 列表,刪除不再與集合中的 object 對應的所有引腳,添加與集合中的新對象對應的所有引腳,並更改任何引腳的位置對應的 object 的位置發生了變化。

我試圖通過迭代引腳並在必要時刪除、添加和更改引腳時進行相應的比較來做到這一點。 這里的問題是每次刪除 Pin 時都會出現以下錯誤:

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.

在修改正在迭代的列表時這是可以預料的,但是所有可用的解決方案都可以解決這個問題,例如在實例化 foreach 循環時使用 Maps.Pins.ToList() ,使用 for 循環而不是 foreach循環,甚至創建 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);
                }
            }

循環

            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

首先十分感謝

要使 for 循環方法起作用,您需要倒數,否則每次刪除項目時都會拋出索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM