Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何在修改列表时迭代Xamarin.Forms.Maps.Pins列表?_List_Xamarin.forms_Collections_Invalidoperationexception_Xamarin.forms.maps - Fatal编程技术网

List 如何在修改列表时迭代Xamarin.Forms.Maps.Pins列表?

List 如何在修改列表时迭代Xamarin.Forms.Maps.Pins列表?,list,xamarin.forms,collections,invalidoperationexception,xamarin.forms.maps,List,Xamarin.forms,Collections,Invalidoperationexception,Xamarin.forms.maps,我正在开发一个Xamarin.Forms应用程序,它利用了地图包。Map对象包含一个IList Pins,用于存储包含标签、位置和其他属性的Pin对象列表。我试图通过将这些管脚的位置与包含相同属性(ID、位置等)的自定义对象集合进行比较,以及比较它们是否存在于该列表中,并相应地删除它们来更新此管脚列表 为了详细说明,每次更新时,我都要遍历Pins列表,删除不再与集合中的对象对应的任何pin,添加与集合中的新对象对应的任何pin,并更改相应对象位置已更改的任何pin的位置 我试图通过迭代引脚并进行

我正在开发一个Xamarin.Forms应用程序,它利用了地图包。Map对象包含一个IList Pins,用于存储包含标签、位置和其他属性的Pin对象列表。我试图通过将这些管脚的位置与包含相同属性(ID、位置等)的自定义对象集合进行比较,以及比较它们是否存在于该列表中,并相应地删除它们来更新此管脚列表

为了详细说明,每次更新时,我都要遍历Pins列表,删除不再与集合中的对象对应的任何pin,添加与集合中的新对象对应的任何pin,并更改相应对象位置已更改的任何pin的位置

我试图通过迭代引脚并进行相应的比较来实现这一点,同时在必要时删除、添加和更改引脚。这里的问题是,每次移除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(map.Pins.ToList()中的Pin-Pin)
{
如果(!newList.Any(x=>x.ID==pin.Label))
{
Debug.WriteLine(“Pin”+Pin.Label+”正在被删除。”);
地图。别针。移除(别针);
}
}
用于循环

for(int i=0;ix.ID==map.Pins[i].Label))
{
Debug.WriteLine(“Pin”+map.Pins[i].Label+”正在被删除。”);
map.Pins.Remove(map.Pins[i]);
}
}
创建新列表

List oldPins=new List();
foreach(映射中的Pin.Pins)
{
oldPins.Add(pin);
}
foreach(旧销中的销)
{
如果(!newList.Any(x=>x.ID==pin.Label))
{
Debug.WriteLine(“Pin”+Pin.Label+”正在被删除。”);
地图。别针。移除(别针);
}
}
//我也尝试了for循环解决方案

非常感谢For loop方法的运行,您需要向后计数,否则每次删除项目时都会抛出索引。

在“For loop”方法中,您需要向后计数,否则每次删除时索引都会出错。您的第三种方法应该可以工作,当您尝试它时会发生什么?我将尝试使用for循环反转索引。使用第三种方法,我得到了相同的无效操作,除了使用递减for循环似乎有效。我不知道为什么其他的解决方案没有。我将进行更多的测试,以确保其按预期工作,但在此期间,如果您想在回答中加入您的建议,我将接受。使用for循环解决方案,同时在map中进行迭代。Pins向后解决了问题。