改进简单的C#程序

时间:2018-03-10 13:00:06

标签: c# function summarize

我刚开始学习用C#编程,我创建了一个非常简单的程序,假设总结了int数组中的所有正数。

程序看起来像这样:

static void Main(string[] args)
{
    int[] intArr = new int[5] { 1, 2, 3, -1, 0 };
    int result = Sum(intArr);
    Console.WriteLine("The total sum of the array is: {0}", result);
    Console.ReadKey();
}

public static int Sum(int[] intArr)
{
    int sum = 0;
    for(int i =0; i < intArr .Length; i++)
    {
        if(values[i]>0)
        {
            sum += intArr[i];
        }
    }
     return sum;
}

有什么方法可以让这个程序更小或改进它的逻辑?

4 个答案:

答案 0 :(得分:2)

尽管如此,你无法对算法进行太多改进。因为你要总结所有的数组元素,你需要至少迭代一次它们,让你尽可能地做到O(n)。

代码本身也无法进行优化。关于使它变小,你可以考虑使用Linq和lambda表达式:

// ...
int result = intArr.Where(i => i > 0).Sum();

lambda表达式(i => i > 0)与Where()一起设置一个谓词(条件),告诉程序对所有元素(i)求和,其中i是一个正整数(=> i > 0)。

但这否定了编写自己的功能的目的。如果没有必要,你甚至可以使用单行:

Console.WriteLine("The total sum of the array is: {0}", new int[] { 1, 2, 3, -1, 0 }.Where(i => i > 0).Sum());

此外,由于您正在使用值初始化数组,因此如上所示,提及数组长度是不必要的。不是一个优化,只是一个提示。

答案 1 :(得分:1)

对于典型的可枚举操作,您可以使用LINQ。既然你可以链接运算符,你可以很容易地先过滤然后求和。

使用常见的LINQ运算符意味着代码比手写代码段更具可读性和可操作性。

int[] intArr = new int[5] { 1, 2, 3, -1, 0 };

int result = intArr.Where( i => i > 0 ).Sum();

Console.WriteLine(result);

答案 2 :(得分:1)

使用静态导入和字符串插值

using static System.Math;
using System.Linq;
using static System.Console;
namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {
            WriteLine($"The total sum of the array is: { new[] { 1, 2, 3, -1, 0 }.Sum(x => Max(0, x))}");
            ReadKey();
        }
    }
}

附加变量更具可读性:

var total = new[] { 1, 2, 3, -1, 0 }.Sum(x => Max(0, x));
WriteLine($"The total sum of the array is: {total}");

答案 3 :(得分:0)

您可以使用lambda表达式改进代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            int[] intArr = new int[5] { 1, 2, 3, -1, 0 };
            int result =  intArr.AsParallel().Where(i => i > 0).Sum();
            Console.WriteLine("The total sum of the array is: {0}", result);
        }
    }
}

如果数组的长度很大,那么使用AsParallel()来划分数组并共享处理核心之间的和运算可能很有用。

https://www.dotnetperls.com/asparallel