我开始在c#中解析主题索引器,并在运行测试任务时遇到问题:
Index.cs:
class Index
{
double[] arr;
public int Length
{
get;
set;
}
public double this[int x]
{
get { return arr[x]; }
set
{
arr[x] = value;
}
}
public Index(double[] arr1, int x, int y)
{
Length = y;
arr = arr1;
for (int i = x; i <= y; i++)
{
if (i == 0)
{
arr[i] = arr1[i + 1];
}
else
{
arr[i - 1] = arr1[i];
}
}
}
}
Program.cs的
static void Main(string[] args)
{
double[] array = { 1, 2, 3, 4 };
var indexer0 = new Index(array, 1, 2);
Console.WriteLine(indexer0.Length);
Console.WriteLine("Result = 2,3");
var indexer1 = new Index(array, 1, 2);
Console.WriteLine(indexer1[0]);
Console.WriteLine(indexer1[1]);
Console.WriteLine("Copy 25");
var indexer2 = new Index(array, 1, 2);
var indexer3 = new Index(array, 0, 2);
indexer2[0] = 25;
Console.WriteLine(indexer3[1]);
Console.WriteLine("Array");
foreach(var item in array)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
正如您在调用indexer1后所看到的,我希望数组值更改为2和3,然后我得到3.3(我知道这是因为当我调用indexer0时我更改了值到2.3,然后我使用数组2,3,3,4,我可以通过将值写入临时变量来修复此问题,但是我无法将值从indexer2复制到indexer3(所需的值为25。请帮我处理其中两个问题。
答案 0 :(得分:5)
您的实现问题是您没有制作原始数组的副本。这将创建对同一数组的第二个引用
arr = arr1;
循环内部的修改,就像这个,
arr[i] = arr1[i + 1];
正在四处移动并覆盖原始数组的元素。
通过分配新数组并将原始数据的内容复制到其中来解决此问题:
public int Length { get { return arr.Length; } }
public Index(double[] arr1, int x, int y) {
arr = new double[y];
Array.Copy(arr1, x, arr, 0, y);
}
请注意,您的Index
将包含原始数组的副本。如果你想要一个&#34;窗口&#34;进入原始数组,而不是副本(即通过Main
,array
等可以看到对index1
index2
的更改。存储{{1}不变,并且还将初始索引存储在私有变量中。您现在可以将索引器实现更改为&#34;索引转换&#34;,即从arr
中减去存储的x
以获取正确的指数:
index