C# 带for循环的时间后操作

C# 带for循环的时间后操作,c#,for-loop,C#,For Loop,我有一个for循环,它扫描每个网格正方形,寻找相邻正方形的值,然后在按下空格键时在网格中设置一个值: public void GridScan(Vector3 worldposition, int range) { GetXY(worldposition, out int originx, out int originy); for (int x = 0; x < range; x++) { for (int

我有一个for循环,它扫描每个网格正方形,寻找相邻正方形的值,然后在按下空格键时在网格中设置一个值:

public void GridScan(Vector3 worldposition, int range)
    {
        GetXY(worldposition, out int originx, out int originy);
        for (int x = 0; x < range; x++)
        {
            for (int y = 0; y < range; y++)
            {
                Debug.Log(GetValue(originx + x, originy + y));
                if ((GetValue(originx + x, originy + y)) == 100)
                {
                    if (Neighbours(GetWorldPosition(x, y), 2) < 2)
                    {
                        SetValue(x, y, 0);
                    }
                    if (Neighbours(GetWorldPosition(x, y), 2) > 3)
                    {
                        SetValue(x, y, 0);
                    }
                }

                if ((GetValue(originx + x, originy + y)) == 0)
                {
                    if (Neighbours(GetWorldPosition(x, y), 2) == 3)
                    {
                        SetValue(x, y, 100);
                    }
                }
            }

        }
    }
public void GridScan(矢量3世界位置,整数范围)
{
GetXY(世界位置,out int originx,out int originy);
对于(int x=0;x3)
{
设定值(x,y,0);
}
}
if((GetValue(originx+x,originy+y))==0)
{
如果(相邻(GetWorldPosition(x,y),2)==3)
{
设定值(x,y,100);
}
}
}
}
}
问题是,for循环将在进入下一个网格方格之前设置该值,这意味着具有某个值的邻居的计数将是错误的(因为某些值会发生更改)


有什么方法可以让我在短时间内,在for循环完成后设置值(if语句中的内容)?我知道如果我使用Invoke,循环只需花时间在循环内执行操作,这不是我想要的。

我不会基于此使用延迟解决方案,而是在计算所有需要设置的值的循环完成后,使用另一个循环执行
SetValue
调用

像这样的事情可能是一个好的开始:

// Note: worldposition type is assumed to be a Position...
var newValues = new List<(Position WorldPosition, int Value)>();

foreach(var worldposition in worldpositionCollection)
{
    Debug.Log(GetValue(worldposition));
    if ((GetValue(worldposition)) == 100)
    {
        if (Neighbours(worldposition, 2) < 2)
        {
            newValues.Add((worldposition, 0));
        }
        if ((Neighbours(worldposition, 2)) > 3) 
        {
            newValues.Add((worldposition, 0));
        }
    }

    if ((GetValue(worldposition)) == 0)
    {
        if (Neighbours(worldposition, 2) == 3)
        {
            newValues.Add((worldposition, 100));
        }
    }
}
newValues.ForEach(val => SetValue(val.WorldPosition, val.Value));
//注意:worldposition类型假定为职位。。。
var newValues=新列表();
foreach(worldpositionCollection中的var worldposition)
{
Log(GetValue(worldposition));
如果((GetValue(worldposition))==100)
{
if(邻居(世界位置,2)<2)
{
newValues.Add((worldposition,0));
}
如果((邻居(世界排名,2))>3)
{
newValues.Add((worldposition,0));
}
}
如果((GetValue(worldposition))==0)
{
if(邻居(世界位置,2)==3)
{
添加((worldposition,100));
}
}
}
ForEach(val=>SetValue(val.WorldPosition,val.Value));

在此基础上,我不会采用基于延迟的解决方案,而是在计算所有需要设置的值的循环完成后,使用另一个循环执行
SetValue
调用

像这样的事情可能是一个好的开始:

// Note: worldposition type is assumed to be a Position...
var newValues = new List<(Position WorldPosition, int Value)>();

foreach(var worldposition in worldpositionCollection)
{
    Debug.Log(GetValue(worldposition));
    if ((GetValue(worldposition)) == 100)
    {
        if (Neighbours(worldposition, 2) < 2)
        {
            newValues.Add((worldposition, 0));
        }
        if ((Neighbours(worldposition, 2)) > 3) 
        {
            newValues.Add((worldposition, 0));
        }
    }

    if ((GetValue(worldposition)) == 0)
    {
        if (Neighbours(worldposition, 2) == 3)
        {
            newValues.Add((worldposition, 100));
        }
    }
}
newValues.ForEach(val => SetValue(val.WorldPosition, val.Value));
//注意:worldposition类型假定为职位。。。
var newValues=新列表();
foreach(worldpositionCollection中的var worldposition)
{
Log(GetValue(worldposition));
如果((GetValue(worldposition))==100)
{
if(邻居(世界位置,2)<2)
{
newValues.Add((worldposition,0));
}
如果((邻居(世界排名,2))>3)
{
newValues.Add((worldposition,0));
}
}
如果((GetValue(worldposition))==0)
{
if(邻居(世界位置,2)==3)
{
添加((worldposition,100));
}
}
}
ForEach(val=>SetValue(val.WorldPosition,val.Value));

I需要更多的上下文。setvalue中的一些代码将有助于您是否真的必须“就地”执行此操作?因为在我看来,这就像是简单地应用了一个过滤器。在我过去做过的所有例子中,我都会在一个新的网格中迭代原始值,然后返回新的网格。@Fildor好的,这听起来很有希望,我不相信我必须“就地”完成函数,我相信这样迭代会很好。如果你不介意分享的话,我该如何迭代这样的东西呢?我是编程新手,你已经迭代过了。“迭代”基本上是指在这种上下文中遍历集合。所以,我所描述的就像你在一张纸上浏览一个列表,然后把你的计算结果写在另一张纸上的列表上,然后你继续使用新的一张纸。。。再看看佐哈尔的答案。这很相似。不同之处在于:在他的解决方案中,他写下了您必须更改的内容,然后在完成后,将这些更改应用到原始网格中。setvalue中的一些代码将有助于您是否真的必须“就地”执行此操作?因为在我看来,这就像是简单地应用了一个过滤器。在我过去做过的所有例子中,我都会在一个新的网格中迭代原始值,然后返回新的网格。@Fildor好的,这听起来很有希望,我不相信我必须“就地”完成函数,我相信这样迭代会很好。如果你不介意分享的话,我该如何迭代这样的东西呢?我是编程新手,你已经迭代过了。“迭代”基本上是指在这种上下文中遍历集合。所以,我所描述的就像你在一张纸上浏览一个列表,然后把你的计算结果写在另一张纸上的列表上,然后你继续使用新的一张纸。。。再看看佐哈尔的答案。这很相似。不同之处在于:在他的解决方案中,他写下了您必须更改的内容,然后在完成后,将这些更改应用到原始网格。Crud,我现在意识到,我遗漏了代码中一个非常关键的部分,这可能会更好地描述我的问题。你想让我编辑这篇文章,向你展示更好的代码吗?@lachiewitehead如果你想编辑答案以匹配问题中更改的代码,请点击