如何从列表中随机选取带数字后缀的新生成字符串并写入Excel
问题分析与解决方案
原代码核心问题
- 循环逻辑混乱:
GeneratePassword方法中,选中初始单词索引后执行names.RemoveAt(index),直接删除了原始单词,后续循环的names[index]指向的是新添加的带数字字符串,导致生成的组合完全偏离预期。 - 无复用机制:每次调用方法都会重新初始化原始单词列表并重复生成组合,既低效又容易引发索引越界问题,最终返回的
names[index]并非正确的带数字密码。
修正后的实现代码
1. 重构密码生成类
将所有密码组合一次性生成并缓存,避免重复计算:
public class Program { private readonly Random _random = new Random(); private readonly List<string> _allPasswordCombinations; public Program() { // 原始单词列表 var baseWords = new List<string> { "Ananas","Auto","Affe","Ameise","Apfel", "Biene","Baum","Birne","Ball","Blume", "Cello","Chips" }; _allPasswordCombinations = new List<string>(); // 生成所有单词+1-48的组合 foreach (var word in baseWords) { for (int num = 1; num <= 48; num++) { _allPasswordCombinations.Add($"{word}{num}"); } } } public string GeneratePassword() { // 从缓存的组合中随机选取一个 int randomIndex = _random.Next(_allPasswordCombinations.Count); return _allPasswordCombinations[randomIndex]; } }
2. 调用代码(保持原有逻辑)
Program pwGenerator = new Program(); var loginIds = new List<string> { "Z00001", "Z00002", "Z00003" }; ws.Cells["B1"].LoadFromArrays(new List<string[]>(new[] { loginIds.ToArray() })); // 随机生成3个密码 var passwords = new List<string> { pwGenerator.GeneratePassword(), pwGenerator.GeneratePassword(), pwGenerator.GeneratePassword() }; ws.Cells["B2"].LoadFromArrays(new List<string[]>(new[] { passwords.ToArray() }));
可选优化:生成不重复的随机密码
如果需要确保选中的3个密码不重复,可修改GeneratePassword方法:
public string GeneratePassword() { if (_allPasswordCombinations.Count == 0) throw new InvalidOperationException("无可用密码组合"); int randomIndex = _random.Next(_allPasswordCombinations.Count); var selectedPassword = _allPasswordCombinations[randomIndex]; _allPasswordCombinations.RemoveAt(randomIndex); return selectedPassword; }
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

