В то время как я соглашаюсь, что лучше использовать встроенное foreach
конструкция в большинстве случаев, я нахожу использование этого изменения на ForEach<> расширение, чтобы быть немного более хорошим, чем необходимость управлять индексом в постоянном клиенте foreach
самостоятельно:
public static int ForEach<T>(this IEnumerable<T> list, Action<int, T> action)
{
if (action == null) throw new ArgumentNullException("action");
var index = 0;
foreach (var elem in list)
action(index++, elem);
return index;
}
Пример var people = new[] { "Moe", "Curly", "Larry" };
people.ForEach((i, p) => Console.WriteLine("Person #{0} is {1}", i, p));
дал бы Вам:
Person #0 is Moe
Person #1 is Curly
Person #2 is Larry
Вы используете y
как в качестве переменной цикла, так и в качестве второго члена в последовательности.
То, что вы хотите сделать, это:
int x = 0;
int y = 1;
int z;
int sum = 0;
do {
z = x + y;
x = y;
y = z;
if (y % 2 == 0) sum += y;
} while (y <= 4000000);
Обратите внимание, что вам, вероятно, следует также инициализировать сумму
.
Для повышения скорости обратите внимание, что последовательность: четный-нечетный-нечетный (повторяется), чет-нечетный-нечетный.
Вам не нужно проверять каждое число, чтобы узнать, это четное или нечетное. Просто добавьте каждое третье число.
Блок кода цикла for должен иметь вид
while(y <= 4000000) {
z = x + y;
x = y;
y = z;
if(y % 2 == 0) {
sum += y;
}
}
По сути, вы не должны увеличивать y.