如何在循环中动态切换待修改数组,避免重复编写代码?
简化多数组赋值的循环代码
我现在需要批量修改多个数组,目前的实现是在循环里通过判断i的值,逐个操作attack1、attack2这类数组,代码如下:
for (int i = 0; i < 4; i++) { if(i==0) { attack1[0] = attacks[i]; attack1[1] = Convert.ToString(atdmg[i]); attack1[2] = ateffect[i]; attack1[3] = Convert.ToString(ataccur[i]); attack1[4] = Convert.ToString(atmul[i]); } if (i == 1) { attack2[0] = attacks[i]; attack2[1] = Convert.ToString(atdmg[i]); attack2[2] = ateffect[i]; attack2[3] = Convert.ToString(ataccur[i]); attack2[4] = Convert.ToString(atmul[i]); } if (i == 2) { attack3[0] = attacks[i]; attack3[1] = Convert.ToString(atdmg[i]); attack3[2] = ateffect[i]; attack3[3] = Convert.ToString(ataccur[i]); attack3[4] = Convert.ToString(atmul[i]); } if (i == 3) { attack4[0] = attacks[i]; attack4[1] = Convert.ToString(atdmg[i]); attack4[2] = ateffect[i]; attack4[3] = Convert.ToString(ataccur[i]); attack4[4] = Convert.ToString(atmul[i]); } }
我想简化这段代码,不用逐个写数组名,而是通过循环变量i动态切换要修改的attacki数组,类似下面的伪代码写法:
for (int i = 0; i < 4; i++) { attacki[0] = attacks[i]; attacki[1] = Convert.ToString(atdmg[i]); attacki[2] = ateffect[i]; attacki[3] = Convert.ToString(ataccur[i]); attacki[4] = Convert.ToString(atmul[i]); }
这段代码的作用是把其他数组的信息存入对应的attack数组,方便后续简化信息打印操作。
解决方案
方法1:用数组容器统一管理
最直接的简化方式是把attack1到attack4先放到一个数组里,然后循环操作这个容器数组的元素,这样就不用逐个判断i的值了:
// 先把所有attack数组放到一个容器数组中 var attackArrays = new[] { attack1, attack2, attack3, attack4 }; for (int i = 0; i < 4; i++) { // 取出当前循环对应的attack数组 var currentAttack = attackArrays[i]; currentAttack[0] = attacks[i]; currentAttack[1] = Convert.ToString(atdmg[i]); currentAttack[2] = ateffect[i]; currentAttack[3] = Convert.ToString(ataccur[i]); currentAttack[4] = Convert.ToString(atmul[i]); }
方法2:用自定义类封装(更推荐)
如果可以重构代码,更建议用自定义类来封装攻击的各项属性,这样代码可读性更高,也能避免数组下标出错的问题:
// 定义一个类来存储攻击的所有属性 public class AttackInfo { public string Name { get; set; } public string Damage { get; set; } public string Effect { get; set; } public string Accuracy { get; set; } public string Multiplier { get; set; } }
然后用列表或数组来存储这些对象,循环赋值的代码会更清晰:
var attackList = new List<AttackInfo>(); for (int i = 0; i < 4; i++) { attackList.Add(new AttackInfo { Name = attacks[i], Damage = Convert.ToString(atdmg[i]), Effect = ateffect[i], Accuracy = Convert.ToString(ataccur[i]), Multiplier = Convert.ToString(atmul[i]) }); }
后续打印信息时,直接遍历attackList即可,比如:
foreach (var attack in attackList) { Console.WriteLine($"名称:{attack.Name},伤害:{attack.Damage},效果:{attack.Effect}"); }
内容的提问来源于stack exchange,提问作者Lolipop
相关产品推荐
相关产品推荐

