如何在不复制的情况下剪切原始数组

时间:2019-02-27 10:26:56

标签: c# arrays

我试图弄清楚如何使用构造函数中传递的数组而不复制它。我正在使用索引器,任务是获取原始数组的子数组。这是我的代码:

`public class Indexer
    {
        public double this[int index]
        {
            get { return array[index]; }
            set { array[index] = value; }
        }

        double[] array;

        public int Length { get { return array.Length; } }

        public Indexer(double[] array,int start,int length)
        {
            if (start < 0 || length<0 || array.Length-start<length) throw new ArgumentException();          
            this.array = array.ToList().GetRange(start, length).ToArray();
        }
    }`

目前,它仅复制原始数组并创建新的子数组。我知道这可能是个简单的问题,但是我真的不知道该怎么做。谢谢!

2 个答案:

答案 0 :(得分:1)

保存起点和长度,然后可以对子数组建立索引而不复制。

public class Indexer
{
    int start, length;
    double[] array;

    public double this[int index]
    {
        get { CheckIndex(index); return array[start + index]; }
        set { CheckIndex(index); array[start + index] = value; }
    }

    public int Length { get { return length; } }

    private void CheckIndex(int index)
    {
        if(index < 0 || index >= length)
            throw new ArgumentOutOfRangeException('index');
    }

    public Indexer(double[] array,int start,int length)
    {
        if (start < 0 || length<0 || array.Length-start<length) throw new ArgumentException();          
        this.array = array;
        this.start = start;
        this.length = length;
    }
}

顺便说一句,ArraySegment已经完成了这项工作。

答案 1 :(得分:0)

您的代码很好,可以正常工作。 我不确定您在寻找什么,

但是我假设您想从Indexer Class获取结果数组。

请参见以下代码,

using System;
using System.Linq;


public class Program
{
    public static void Main()
    {
        double[] d=new double[7]{1.0,2.0,3.0,4.0,5.0,6.0,7.0};
        var inx=new Indexer(d,1,3);
        foreach(var i in inx.array)
        {
            Console.WriteLine(i);
        }
        Console.WriteLine("d.LEn="+inx.array.Length);
        Console.WriteLine("Hello World");
    }
    public class Indexer
    {
        public double this[int index]
        {
            get { return array[index]; }
            set { array[index] = value; }
        }

        public double[] array;

        public int Length { get { return array.Length; } }

        public Indexer(double[] array,int start,int length)
        {
            if (start < 0 || length<0 || array.Length-start<length) throw new ArgumentException();          
            this.array = array.ToList().GetRange(start, length).ToArray();
        }
    }
}