如何从字符串数组中移除已选元素实现任务系统随机抽取不重复任务
不重复随机抽取任务实现方案
C# 中原生字符串数组是固定长度结构,没有内置的直接移除元素的方法,更推荐用动态列表 List<string> 来维护任务池,操作更简便,性能也更好。
具体实现步骤
- 第一步:初始化任务池,替换原有的数组定义
// 直接初始化列表,也可以用现有数组转:QuestChoose.ToList() List<string> questPool = new List<string> {"Quest1", "Quest2", "Quest3"};
- 第二步:随机抽取+移除已选任务的逻辑
if (questPool.Count > 0) { Random random = new Random(); // 生成0到任务池数量-1范围内的随机下标 int selectedIndex = random.Next(questPool.Count); // 拿到选中的任务 string selectedQuest = questPool[selectedIndex]; // 移除已选中的任务,后续抽取就不会重复命中 questPool.RemoveAt(selectedIndex); } else { // 所有任务都抽取完成的兜底逻辑 }
如果一定要保留原生数组的实现方式,可以通过LINQ生成新数组的方式移除指定元素:
string[] QuestChoose = new string[] {"Quest1", "Quest2", "Quest3"}; // 假设要移除下标为1的元素 int removeIndex = 1; QuestChoose = QuestChoose.Where((_, index) => index != removeIndex).ToArray();
注意:数组移除元素的本质是生成了新的数组对象,频繁操作的性能开销远高于List,非必要不推荐使用该方案
内容的提问来源于stack exchange,提问作者PARTY-TIME
相关产品推荐
相关产品推荐

