Я думаю, что я бы избегал LINQ для этого и просто пошел бы по стандартной "петле над каждым элементом, если ток больше, чем max, подтолкнуть ток max ко второму месту, текущее значение к току max"
int sec = int.MinValue;
for(int i =0, m= int.MinValue; i <list.Length; i++)
if(list[i] > m){
sec = m;
m = list[i];
}
Ваша логика различает значения, поэтому похоже, что 20 не является вторым по величине в вашем списке, хотя есть три значения, равные 20. Это достигается здесь с помощью>.Если бы я использовал> =, то каждые 20 катили бы переменные, и он вел бы себя так, как если бы они не различались
Если вы заинтересованы в производительности, протестируйте его в списке с несколькими миллионами записей и выберите однучто соответствует вашему аппетиту к читабельности против скорости