我正在尝试针对 Problem 1 测试三种解决方案的性能来自 projecteuler.net通过传递 int.MaxValue
而不是 1000。
第一个解决方案:
long sum = SumDivisibleBy(3) + SumDivisibleBy(5) - SumDivisibleBy(15);
Console.WriteLine(sum);
SumDivisibleBy 在哪里:
public static long SumDivisibleBy(int k, int n = int.MaxValue)
{
long m = n / k;
return k * (m * (m + 1) / 2);
}
比
快(大约 27 秒)第二种解决方案:
long sum = 0;
for (int i = 0; i < int.MaxValue; i++)
{
if (i % 3 == 0 || i % 5 == 0)
{
sum += (long)i;
}
}
Console.WriteLine(sum);
第三种解决方案(在我看来这是一个优雅的解决方案)是:
Console.WriteLine(Enumerable.Range(1, 999)
.Where(x => x % 3 == 0 || x % 5 == 0)
.Sum());
但我无法实现(出于测试性能目的):
Console.WriteLine(Enumerable.Range(1, int.MaxValue)
.Where(x => x % 3 == 0 || x % 5 == 0)
.Sum());
因为它给了我一个 OverflowException
这是自然的,因为 int Sum(this IEnumerable<int> source)
的性质.
我的问题是:
我怎样才能向上转换 int Sum(this IEnumerable<int> source)
到 long Sum(this IEnumerable<long> source)
在下面的代码中:
Console.WriteLine(Enumerable.Range(1, int.MaxValue)
.Where(x => x % 3 == 0 || x % 5 == 0)
.Sum());
最佳答案
尝试将过滤后的整数序列投影到长整数序列:
.Where(x => x % 3 == 0 || x % 5 == 0)
.Select(x => (long)x)
.Sum()
请注意 .Cast<long>()
看起来更优雅但won't work for this kind of conversion .
关于c# - 如何计算 LINQ 中谓词过滤的巨大范围的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27837547/