我试图弄清楚如何使用构造函数中传递的数组而不复制它。我正在使用索引器,任务是获取原始数组的子数组。这是我的代码:
`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();
}
}`
目前,它仅复制原始数组并创建新的子数组。我知道这可能是个简单的问题,但是我真的不知道该怎么做。谢谢!
答案 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();
}
}
}