迭代列表而不修改它?

时间:2017-12-21 00:03:19

标签: c# unity3d

我对c#很新,所以我对此感到有点困惑。我在for循环中有一个函数,它引用一个数组并返回另一个数组,但它所接受的数组也被修改了。每次传入数组之前是否需要克隆数组?

for (int floor = 0; floor < numberOfFloors; ++floor)
{
    // takes in linePoints, does some calculations and returns a new list
    List<Vector3> floorLinePoints = processFloorSetbacks(linePoints); 
}

原始的linePoints数组在每次迭代时都会被修改 - 它是否意味着这样做?

1 个答案:

答案 0 :(得分:2)

如果您修改linepoint中的每个processFloorSetbacks,则更改将保留在那里,您将需要使用所需的修改重新创建每个linePoint,或克隆它们以重新创建列表。即不要编辑传入的那个。

您可以通过在processFloorSetbacks方法开头选择新列表并使用克隆列表进行修改来克隆列表

var clonedList = linePoints.Select(x => new Vector3
{
     SomeValue = x.SomeValue,
     SomeOtherValue = X.SomeOtherValue,
     // and so on
}

或者它可能就像将一些初始参数传递给它的构造函数一样简单(我不确定)

var clonedList = linePoints.Select(x => new Vector3( x.SomeValue, x.SomeOtherValue));

注意:由于我不确定统一3结构Vector3,所以我不确定你将如何克隆它们,也许这应该是Unity3d工作人员的另一个问题。