C#生成手机号性能优化求助:批量生成手机号速度过慢如何解决?
提升手机号生成与DataGridView加载性能的方案
先帮你梳理下当前代码里拖慢性能的核心问题,再给你针对性的优化方案:
1. 删掉完全多余的外层循环
你代码里的do-while循环完全没必要,而且如果number一开始就等于textBox2的数值,会直接陷入无限死循环——这不仅拖慢性能,还会让程序直接卡死。直接把这个外层循环删掉就好。
2. 避免重复解析字符串
你在循环条件里反复调用Convert.ToInt64(textBox2.Text),每次循环都要把字符串转成数字,这是毫无意义的性能浪费。应该提前把textBox1和textBox2的数值解析好,存在变量里复用。
3. 批量添加行,减少UI刷新(最关键的优化点)
直接在循环里调用dataGridView1.Rows.Add()是性能杀手——每加一行,DataGridView都会触发一次UI重绘,几千几万次下来,界面会巨卡。正确的做法是先把所有要生成的手机号存在一个集合里,然后一次性批量导入到DataGridView,这样只触发一次UI刷新。
优化后的完整代码
// 提前解析数值,避免重复转换,同时做合法性校验 if (!long.TryParse(textBox1.Text, out long startNumber) || !long.TryParse(textBox2.Text, out long endNumber)) { MessageBox.Show("请输入有效的数字!"); return; } string prefix = textBox3.Text; // 用List先缓存所有要生成的手机号 List<string> phoneNumbers = new List<string>(); // 循环生成所有号码,改成<=后就不用额外添加最后一行了 for (long i = startNumber; i <= endNumber; i++) { phoneNumbers.Add(prefix + i); } // 批量添加到DataGridView,先暂停布局避免频繁刷新 dataGridView1.SuspendLayout(); dataGridView1.Rows.Clear(); // 如果需要清空原有内容的话 foreach (string number in phoneNumbers) { dataGridView1.Rows.Add(number); } // 更高效的方式:直接绑定数据源(推荐) // dataGridView1.DataSource = phoneNumbers.Select(n => new { 手机号 = n }).ToList(); dataGridView1.ResumeLayout();
额外进阶优化(针对超大量数据)
如果要生成几十万甚至上百万条手机号,可以考虑:
- 用
async/await把生成逻辑放到后台线程,避免UI全程卡死 - 开启DataGridView的虚拟模式(Virtual Mode),只加载当前可见区域的行,大幅降低内存占用和加载时间
内容的提问来源于stack exchange,提问作者ilyas zahi
相关产品推荐
相关产品推荐

