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

标签 c# linq

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

相关文章:

c# - 在 List 上执行表达式

c# - 使用 XElement 时如何输入文本

c# - Linq - 对列表的列表进行操作

c# - 如何计算通过 3 个点的循环弧并在 3d 中将其参数化为 0..1

c# - StackExchange Redis 在使用异步插入/读取数据时丢失了一些键

c# - 应用程序的 Xamarin UWP 图标 Assets

c# - 带 OR 的 linq where 语句

c# - 如何在blazor Webassembly中访问appsettings

c# - 如何开始使用 Google API v3?

c# - 通过两个字段获取不同的值