c# - 当 List 不为空时,从 List 中删除一个随机元素会导致无限循环
问题描述
我正在研究一个简单的随机播放脚本。我有一个通用方法,它将 a 作为输入List<T>
并返回 a List<T>
。返回的List
应该是洗牌的。但是,代码陷入了无限循环,我不知道为什么。
这是我的代码:
private List<T> Shuffle<T>(List<T> p)
{
List<T> result = new List<T>();
int idx = 0;
while (p.Count > 0)
{
idx = Random.Range(0, p.Count);
print(idx);
result.Add(p[idx]);
p.Remove(p[idx]);
}
print("Shuffled");
return result;
}
我希望代码能够工作,因为p.Count
越来越小。但是,它卡住了。while
这是我制作的循环的替代方法,它有效,但感觉有些草率:
for (int i = 0; i < p.Count; i++)
{
idx = Random.Range(0, p.Count);
print(idx);
result.Add(p[idx]);
p.Remove(p[idx]);
}
这更像是一个“为什么”的问题而不是一个问题,但我仍然希望你能帮助我。提前致谢!
解决方案
第一行
List<T> result = p;
是问题。请注意,这result
和p
共享相同的参考,这就是为什么
result.Add(p[idx]);
添加 toresult
和 top
也p.Count > 0
永远成立while (p.Count > 0)
(变成无限循环)。应该
private List<T> Shuffle<T>(List<T> p)
{
List<T> result = new List<T>(); // result and p are different lists now
while (p.Count > 0)
{
idx = Random.Range(0, p.Count);
print(idx);
result.Add(p[idx]); // Now we Add to result only, and Remove from p
p.RemoveAt(idx); // <- I suggest removing at index
}
print("Shuffled");
return result;
}
推荐阅读
- python - 如何从另一个py文件运行一个py文件?
- angular - 角度切换按钮未更新
- mysql - 如何在 MySQL 中创建可以加入 Wordpress wp_users 和 wp_usermeta 并存储在另一个表中的触发器
- javascript - 单击选项卡时过滤数据
- css - 如何简单地使用除一个属性外具有相同属性的 CSS 类
- python - 如何在整个小时内激活 python 程序?(下午 12:00:00,上午 04:00:00)
- c# - 来自名称的 REGEX 特定单词
- python - 绘制正则化路径
- firebase - react-native-firebase 返回应用程序并在电子邮件验证后使用动态链接进行验证
- postgresql - Postgres:我可以使用 PostgreSQL INSTEAD OF INSERT 规则绕过错误“无法插入生成的列”吗?