我刚开始学习用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;
}
有什么方法可以让这个程序更小或改进它的逻辑?
答案 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()来划分数组并共享处理核心之间的和运算可能很有用。