2011-12-20 2 views
1

я создал простую программу для вычисления простых чисел следующим образом:Почему LINQ работает так, как ожидалось?

 var db = new HighScoreEntities(); 
     List<Int64> primes = new List<Int64>(){1}; 
     for (Int64 x = 2; x < Int64.MaxValue; x++) 
     { 
      if (primes.FirstOrDefault(y=> x%y == 0) == 0){ 
       primes.Add(x); 
       db.Primes.AddObject(Prime.CreatePrime(x)); 
       db.SaveChanges(); 
      } 
     } 

Моя проблема заключается в том, что y выходит с 225 на первом пройти и то, что кажется случайными числами впоследствии. Почему он не перебирает список «простых чисел»? Я также попытался использовать функцию Exists с тем же результатом.

+1

Разве это не только поиск чисел, которые не делятся на простое число, а не на те, которые не делятся на любое число? – Reddog

+0

Во-первых, если x = 2, то ваша формула равна 2% y == 0, что, насколько я знаю, это не то, как вы вычисляете простое. Далее, что происходит в Prime.CreatePrime()? –

+1

@ Реддог - это действительно действительный подход. проверка делимости на составные числа будет излишней, так как любое составное число может быть факторизовано в простые числа в любом случае. –

ответ

5

1 не является простым, поэтому добавление его к primes, вероятно, является плохим началом. Похоже, что на каждой итерации цикла вы находите первый элемент в primes, так что остаток x/1 равен 0, что всегда будет истинным.

Я не пробовал программу самостоятельно, поэтому я мог ошибаться, но это должно быть хорошим местом для начала.

+0

Идея заключалась в том, чтобы начать добавлять в базу данных в 2, и это должно было упростить вещи. Это хороший момент, но это не объясняет мне, почему y отлаживает такой странный номер. –

+0

@Jeff. Я тоже не уверен, но я бы обязательно начал с инициализации с помощью 'primes' в' {2} 'и' x' на '3'. –

+2

@ JeffLauder - это код, который вы отправили точно так же, как и вы? Потому что нет способа 'y' принять значение 225. Я запускаю ваш код (удаленная часть, связанная с базой данных), и он никогда не давал мне такого значения,' y' всегда было только 1. – Pako

2

Первый выпуск, который я вижу с этим кодом, состоит в том, что список primes инициализирован 1. Есть две проблемы с этим номером - 1 не является простым числом, а 1 всегда будет соответствовать требованиям, представленным в FirstOrDefault lambda, потому что любое число по модулю даст 0 в результате.

Кроме того, все выглядит довольно хорошо.

3

Я думаю, что вы хотите, чтобы оператор .any

if (!primes.Any(y=> x%y == 0)) 

Также имеется множество примеров использования LINQ и PLINQ для вычисления простых чисел. Here's just one.

+0

Да, для этой конкретной реализации 'Any()' выглядит как способ. –

+0

'Any' выглядит более естественным для меня также, однако' FirstOrDefault' тоже будет полезен здесь. Если будет какое-то число, удовлетворяющее предъявляемым требованиям, 'FirstOrDefault' вернет это число (и оно будет отличаться от 0), а если нет, оно вернет 0 в качестве значения по умолчанию для' int'. Но вы правы - «Любой» улучшит читаемость кода. – Pako

Смежные вопросы