代码之家  ›  专栏  ›  技术社区  ›  Filburt kukabuka

C中整数数组的求和方法#

  •  84
  • Filburt kukabuka  · 技术社区  · 15 年前

    有没有 更好的 比迭代数组的方法短?

    int[] arr = new int[] { 1, 2, 3 };
    int sum = 0;
    for (int i = 0; i < arr.Length; i++)
    {
        sum += arr[i];
    }
    

    澄清:

    更好的主要意味着代码更干净,但也欢迎有关性能改进的提示。(如前所述:拆分大型数组)。


    这不像是我在寻找杀手级的性能提升-我只是想知道这是不是 语法甜头 不可用:“有字符串。join-int有什么用?”.

    10 回复  |  直到 6 年前
        1
  •  147
  •   Tomas Vana    13 年前

    如果您可以使用C 3.5和LINQ,请尝试

    int sum = arr.Sum();
    
        2
  •  62
  •   Ahmad Mageed    15 年前

    是的,有。使用.NET 3.5:

    int sum = arr.Sum();
    Console.WriteLine(sum);
    

    如果不使用.NET 3.5,可以执行以下操作:

    int sum = 0;
    Array.ForEach(arr, delegate(int i) { sum += i; });
    Console.WriteLine(sum);
    
        3
  •  19
  •   Chris    15 年前

    使用LINQ:

    arr.Sum()
    
        4
  •  5
  •   unholysampler    15 年前

    这取决于你如何更好地定义。如果希望代码看起来更干净,可以使用.sum(),如其他答案中所述。如果您希望操作快速运行,并且您有一个大数组,则可以通过将其拆分为子和,然后对结果求和,使其并行。

        5
  •  2
  •   HENG Vongkol    8 年前

    如果不喜欢LINQ,最好使用foreach循环来避免索引溢出。

    int[] arr = new int[] { 1, 2, 3 };
    int sum = 0;
    foreach (var item in arr)
    {
       sum += item;
    }
    
        6
  •  1
  •   DragonSpit    6 年前

    上述for循环解决方案的一个问题是,对于具有所有正值的以下输入数组,求和结果为负数:

    int[] arr = new int[] { Int32.MaxValue, 1 };
    int sum = 0;
    for (int i = 0; i < arr.Length; i++)
    {
        sum += arr[i];
    }
    Console.WriteLine(sum);
    

    总和是-2147483648,因为正结果对于int数据类型太大,溢出为负值。

    对于相同的输入数组,arr.sum()建议会导致引发溢出异常。

    更健壮的解决方案是使用更大的数据类型,如“long”或“double”,如下所示:

    int[] arr = new int[] { Int32.MaxValue, 1 };
    long sum = 0;
    for (int i = 0; i < arr.Length; i++)
    {
        sum += arr[i];
    }
    

    对于实现数据并行(simd/sse)和多核的更快版本,可以使用hpcharp nuget包( https://www.nuget.org/packages/HPCsharp/ ,这是开源和免费的。这些实现比linq arr.sum()和arr.asparell.sum()快很多倍,并且不会引发溢出异常,也不会溢出到负数中。

    hpcharp还使用kahan和neumair浮点求和算法为浮点和双数组实现了更精确的arr.sum()。

        7
  •  0
  •   Ben Voigt    15 年前

    使用foreach的代码要短一些,但在JIT优化识别for循环控制表达式中的长度比较之后,在运行时可能会执行完全相同的步骤。

        8
  •  0
  •   merrais    7 年前

    在我的一个应用程序中,我使用了:

    public class ClassBlock
    {
        public int[] p;
        public int Sum
        {
            get { int s = 0;  Array.ForEach(p, delegate (int i) { s += i; }); return s; }
        }
    }
    
        9
  •  0
  •   John Alexiou    6 年前

    另一种选择是使用 Aggregate() 扩展方法。

    var sum = arr.Aggregate((temp, x) => temp+x);
    
        10
  •  -5
  •   Robert Columbia yusuf dalal    7 年前

    尝试此代码:

    using System;
    
    namespace Array
    {
        class Program
        {
            static void Main()
            {
                int[] number = new int[] {5, 5, 6, 7};
    
                int sum = 0;
                for (int i = 0; i <number.Length; i++)
                {
                    sum += number[i];
                }
                Console.WriteLine(sum);
            }
        }
    } 
    

    结果是:

    二十三