所以我在使用C#程序时遇到了一些麻烦,该程序旨在将列表中的8个高度值相加。
该程序通过声明变量currenthigh
来工作,该变量存储来自gradelist
的值。然后,它将自身与值abshigh
进行比较,以查看它是否大于建立的最高值。如果是,则将currenthigh
设置为新的最高值。
一旦循环遍历列表并确认最高值,它就会将其添加到uppertotal
变量并使用ejector
变量将其从列表中删除。然后程序迭代,这次没有先前的最高值。它迭代8次,最后将前8个值添加到uppertotal
。
麻烦的是,尽管代码有删除它的指令,但最高变量仍保留在列表中,因此它只会将最高值添加到自身8次。
int currenthigh = 0;
int abshigh = 0;
int ejector = 0;
int uppertotal = 0;
for (int g = 0; g < 8; g++)
{
for (int z = 0; z < gradelist.Count; z++)
{
Console.WriteLine("PASS STARTED");
currenthigh = Convert.ToInt32((gradelist[z]));
Console.WriteLine("currenthigh" + currenthigh);
if (currenthigh > abshigh)
{
abshigh = currenthigh;
ejector = z;
}
}
Console.WriteLine("ejector" + ejector);
uppertotal = uppertotal + currenthigh;
gradelist.RemoveAt(ejector);
Console.WriteLine("PASS COMPLETE");
Console.WriteLine("RESETING");
}
注意 - gradelist
是一个包含至少12个项目的整数列表。
答案 0 :(得分:1)
这是因为您没有从成绩列表中删除最高值。注意,你把Z放在ejector中,但是Z是gradelist中的一个索引,当你试图删除它时,你什么也没有删除,因为作为一个成员,等级列表中没有Z!而不是
gradelist.RemoveAt(ejector);
你应该这样做:
gradelist.RemoveAt(gradelist[ejector]);
但我建议你采用完全不同的方法。如果你只想获得你的uppertotal,这是gradlist中前8名成员的总和,请使用这个简单的技巧:
uppertotal += gradelist.OrderByDescending(p => p).Take(8).Sum();
答案 1 :(得分:0)
对于相对简单的任务,您的代码非常大
您可以按如下方式选择列表的顶部X
:
top_list = gradelist.OrderByDescending(i => i).Take(X)
使用列表/集合时System.Linq
是您的朋友