gpt4 book ai didi

c# - 为什么循环不从列表中删除所有不是以 "CM"开头的项目?

转载 作者:行者123 更新时间:2023-12-05 08:30:22 26 4
gpt4 key购买 nike

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine;
using System.Linq;

public class CamerasInfo : MonoBehaviour
{
public List<CinemachineFreeLook> FreeLook;
public List<CinemachineVirtualCamera> Virtual;
public List<Camera> AllCameras;
public List<string> currentActiveCameras;

// Start is called before the first frame update
void Start()
{
Cameras();
}

// Update is called once per frame
void Update()
{

}

public void Cameras()
{
FreeLook = FindObjectsOfType<CinemachineFreeLook>().ToList();
Virtual = FindObjectsOfType<CinemachineVirtualCamera>().ToList();
for(int i = 0; i < Virtual.Count; i++)
{
if (!Virtual[i].name.StartsWith("CM"))
Virtual.RemoveAt(i);
}

AllCameras = Camera.allCameras.ToList();

foreach (CinemachineFreeLook freelook in FreeLook)
{
if (freelook.isActiveAndEnabled)
currentActiveCameras.Add(freelook.Name);
}

foreach (CinemachineVirtualCamera vir in Virtual)
{
if (vir.isActiveAndEnabled)
currentActiveCameras.Add(vir.Name);
}

for(int i = 0; i < AllCameras.Count; i++)
{
if (AllCameras[i].isActiveAndEnabled)
currentActiveCameras.Add(AllCameras[i].name);
}
}
}

在这种情况下,这部分有 8 个摄像头在虚拟中监听:

for(int i = 0; i < Virtual.Count; i++)
{
if (!Virtual[i].name.StartsWith("CM"))
Virtual.RemoveAt(i);
}

Cameras

但它只删除了 3 个摄像头而不是 6 个。最后我应该只剩下两个以 CM 开头的摄像头,但在编辑器中有 5 个摄像头:

它没有删除底部顶部和中间:

Cameras

最佳答案

问题是您在列表中向前迭代,同时也从列表中删除项目。

举个例子

 0       1       2
[TopRig, TopRig, CM]

我们进入for循环,i = 0。我们查看元素 0,即 TopRig,因此我们调用 .RemoveAt(0)。我们的名单现在是:

 0       1
[TopRig, CM]

我们现在进入 for 循环的下一次迭代,i 递增到 1。我们查看(修改后的)列表的元素 1,并看到这是CM

看到问题了吗?我们直接跳过了第二个 TopRig,因为我们从列表中删除了一个元素(导致所有后续元素向后移动),并且还增加了 i。如果我们从列表中删除一个项目,我们需要确保我们只增加i:

for (int i = 0; i < Virtual.Count; /* no increment */)
{
if (!Virtual[i].name.StartsWith("CM"))
Virtual.RemoveAt(i);
else
i++;
}

或说明它将递增的事实:

for (int i = 0; i < Virtual.Count; i++)
{
if (!Virtual[i].name.StartsWith("CM"))
{
Virtual.RemoveAt(i);
i--;
}
}

您还可以向后循环遍历列表,从而回避问题:

for (int i = Virtual.Count - 1; i >= 0; i--)
{
if (!Virtual[i].name.StartsWith("CM"))
Virtual.RemoveAt(i);
}

关于c# - 为什么循环不从列表中删除所有不是以 "CM"开头的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64715715/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com