我正在尝试建立我的团结项目,但是我不能因为foreach循环存在问题。下面是我收到的错误代码,但我不明白。有人能够解释可能的解决方案吗?或者为什么会出现这种错误?
InvalidOperationException:修改了集合;枚举操作可能无法执行。 System.Collections.Generic.List`1 + Enumerator [UnityEngine.Vector3] .VerifyState()(at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/List.cs:778 )
System.Collections.Generic.List`1 + Enumerator [UnityEngine.Vector3] .MoveNext()(at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/List。 CS:784)
Player_Movement.Update()(在Assets / Scripts / Player / Player_Movement.cs:46 )
为了给代码提供上下文,你在屏幕上画一条线,然后它会创建一个载体列表供玩家移动。
void Update()
{
//when the player moves their finger accross the screen of the mouse button is held down
if ((Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved) || (Input.GetMouseButton(0)))
{
//raycasthit variable called hit
RaycastHit hit;
//ray variable called ray
Ray ray;
//the ray variable is cast between the main camera and the mouse position
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//if the physics racast hit then calulate the distance betwen the point (mouse position) and the camera
if (Physics.Raycast(ray, out hit))
{
//save the positon as the nextPosition
nextPosition = hit.point;
//save the nextPositions point's yaxis
nextPosition.y = yAxis;
//if there are positions inside of the position list
if (positionList.Count != 0)
{
//then for each vector3 position in the list
Line 46 ===> foreach(Vector3 t in positionList)
{
//if there is no posiiton in the list where one should be
if (nextPosition != t)
{
//then create a position
positionList.Add(nextPosition);
}
}
}
else
{ //otherwise create a position in the position list
positionList.Add(nextPosition);
}
}
}
}
答案 0 :(得分:1)
在迭代时,您无法修改列表(即.Add()
)。
找到匹配的元素,然后根据需要添加:
if(positionList.FirstOrDefault(t => nextPosition == t) != null)
positionList.Add(nextPosition);
答案 1 :(得分:1)
您获得该例外的原因是您在重复搜索时尝试修改该集合。有几种方法可以解决这个问题,但最好的方法是简单地测试你的条件(集合中是否包含特定的项目),然后在测试为假的情况下修改集合(添加项目)。
Linq扩展Any
在这里派上用场了。如果集合中的任何项与条件匹配,则返回true。将!
放在它前面意味着您正在寻找没有任何符合条件的项目的情况:
if (!positionList.Any(position => position == nextPosition))
{
positionList.Add(nextPosition);
}
但你可以使用Linq
方法在没有Contains
的情况下执行此操作,这种方法实际上更简单,更具可读性:
if (!positionList.Contains(nextPostition))
{
positionList.Add(nextPostition);
}
请注意,这些答案也会修复代码中的错误。要公开错误并仍然避免错误,您可以在ToList()
循环内的集合上调用for
,如下所示:
foreach(Vector3 t in positionList.ToList())
{
//if there is no posiiton in the list where one should be
if (nextPosition != t)
{
//then create a position
positionList.Add(nextPosition);
}
}
此处对ToList()
的调用实际上会创建列表的新副本并对其进行迭代,因此在修改原始列表时不会发生冲突。但是,您会注意到,每次遇到不匹配时,您现有的代码都会将nextPosition
添加到列表中,我不认为这是您的预期行为。