由于List中的Foreach循环,游戏不会构建

时间:2017-05-15 01:39:01

标签: c# list for-loop unity3d foreach

我正在尝试建立我的团结项目,但是我不能因为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);
            }
        }
    }
}

2 个答案:

答案 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添加到列表中,我不认为这是您的预期行为。