我正在做一些代码挑战,我想通过指定起始索引并从起始索引仅获取第一个(3个或可以是任意长度)值来从数组中获取前三个值。
我尝试了这段代码,并且可以正常工作,但是代码结构太长,因此如何使它更短,以便于理解。
int n = 10;
double signature = new double[] { 1, 1, 1 };
double[] ret = new double[n];
double sum = 0;
ret[0] = signature[0];
ret[1] = signature[1];
ret[2] = signature[2];
int x, i;
for (i = 0; i < n - signature.Length; i++)
{
for(x = i; x <= signature.Length + i; x++)
{
sum += ret[x];
}
ret[x - 1] = sum;
sum = 0;
}
return ret;
答案 0 :(得分:3)
没有 Linq 解决方案:
private static T[] Extract<T>(T[] source, int fromIndex, int length) {
if (null == source)
throw new ArgumentNullException(nameof(source));
else if (fromIndex < 0)
throw new ArgumentOutOfRangeException(nameof(fromIndex),
"From Index must be non-negative");
else if (length < 0)
throw new ArgumentOutOfRangeException(nameof(length),
"Length must be non-negative");
if (fromIndex >= source.Length || length == 0)
return new T[0];
T[] result = new T[Math.Min(length, source.Length - fromIndex)];
Array.Copy(source, fromIndex, result, 0, result.Length);
return result;
}
然后
double[] signature = new double[] { 0, 1, 2, 3, 4, 5 };
double[] ret = Extract(signature, 3, 2);
Console.Write(string.Join(", ", ret));
结果:
3, 4
答案 1 :(得分:2)
使用LINQ,您可以尝试以下操作:
var values = array.Skip(index)
.Take(n)
.ToArray();
index
是第一个项目的索引,n
是您要选择的项目数。
例如https://dotnetfiddle.net/Pk1rwY
作为旁注。使用LINQ并不意味着您的代码会更快。这样会更紧凑/更易读,等等。为了评估代码的性能,您必须使用类似BenchmarkDotNet的代码。
答案 2 :(得分:2)
根据您的问题,您需要利用运算符.Take
和.Skip
。
var result = array.Skip(startingIndex).Take(numberOfElements);
因此,从您的代码看来,您正在尝试做一些不同的事情,即求和元素。 .Sum
运算符在这里可能会有所帮助。