从c清单中获取列表中的最高值

时间:2018-05-07 11:59:36

标签: c# list loops

所以我在使用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个项目的整数列表。

2 个答案:

答案 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是您的朋友