为什么LINQ没有像预期的那样工作?
我创建了一个简单的程序来计算素数如下:为什么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不是素数,所以将其添加到primes
可能是一个不好的开始。它看起来像在每个循环迭代中找到primes
中的第一个元素,使得x/1的其余部分为0,这将始终为真。
我没有自己试试这个程序,所以我可能是错的,但那应该是一个很好的开始。
这个想法是在2开始添加到数据库,它是为了简化事情,这是一个好点,但它并没有向我解释为什么y在这样一个奇怪的数字上进行调试 – 2011-12-20 20:52:23
@Jeff - 我也不确定,但是我肯定会开始在'{2}'和'x'处初始化'primes'在'3'。 – 2011-12-20 20:53:30
@ JeffLauder-您发布的代码与您使用的代码完全相同吗?因为没有办法'y'取得值225.我运行你的代码(虽然删除了与数据库相关的部分),它从来没有给我这样的价值,'y'总是只有1. – Pako 2011-12-20 20:57:20
我用这段代码看到的第一个问题是primes
列表是用1初始化的。这个数字有两个问题--1不是素数,1总是满足FirstOrDefault
lambda中的要求,因为任何数模结果会给0。
除此之外,一切似乎相当确定。
是的,对于这个特定的实现,Any()似乎是要走的路。 – 2011-12-20 21:01:02
'任何'对我来说似乎都比较自然,然而'FirstOrDefault'在这里也会做得很好。如果有任何号码会议提出要求,FirstOrDefault将返回这个数字(它将不同于0),如果不是,它将返回0作为“int”的默认值。但是你是对的 - “任何”都可以提高代码的可读性。 – Pako 2011-12-20 21:01:52
难道这不仅仅是寻找不能被素数整除的数字,而不是那些不能被任何数字整除的数字吗? – Reddog 2011-12-20 20:49:01
首先,如果x = 2,那么你的公式是2%y == 0,据我所知,这不是你如何计算素数。此外,Prime.CreatePrime()内部会发生什么? – 2011-12-20 20:50:51
@Reddog - 这实际上是一种有效的方法。通过综合数字检查可分性将是多余的,因为任何组合数都可以被分解为素数。 – 2011-12-20 20:51:40