流水笔记

面向免费零食和饮料的编程

使用LINQ表达式来求素数

不得不说,这是相当无聊的问题,用LINQ来做Sieve,不仅效率低,而且可读性差,因此纯粹是练习LINQ。。

同样不得不说的是,Aggregate函数(也就是一般意义上的reduce函数)确实异常强大。。

sieve in LINQ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public IEnumerable<int> GetPrimesUsingLinq(int maxValue)
{
    return Enumerable.Range(2, maxValue - 1).Aggregate(
        Enumerable.Range(0, maxValue + 1).ToList(),
        (sieve, x) =>
        {
            if (sieve[x] > 0)
            {
                Enumerable.Range(2, maxValue / x - 1).Select(i => i * x).Aggregate(sieve, (s, i) => { s[i] = 0; return s; });
            }
            return sieve;
        },
        x => x.Where(i => i > 1)
    );
}