从具有指定长度的特定索引获取数组值

时间:2019-08-09 07:56:19

标签: c# arrays linq

我正在做一些代码挑战,我想通过指定起始索引并从起始索引仅获取第一个(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;

3 个答案:

答案 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运算符在这里可能会有所帮助。