gpt4 book ai didi

c# - 如何计算 LINQ 中谓词过滤的巨大范围的总和

转载 作者:太空宇宙 更新时间:2023-11-03 21:24:48 25 4
gpt4 key购买 nike

我正在尝试针对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com