Обертка над массивом double[] - C#
Формулировка задачи:
Здравствуйте, подскажите пожалуйста с решением задания.
Само задание:
Нужно организовать различные виды доступа к одним и тем же данным. Напишите класс Indexer, который создается как обертка над массивом double[], и открывает доступ к его подмассиву некоторой длины, начиная с некоторого элемента.
Тесты, которые должен проходить класс:
Такая реализация класса пока получилась:
Проблема пока с этим тестом:
Да и из формулировки задачи следует, что надо обеспечить доступ к одним и тем же данным. То есть нужно менять как-то передаваемый в конструкторе внешний массив, а не так как у меня это реализовано.
Вопрос: Как это можно сделать? С учетом того, что
[TestFixture]
class Indexer_should
{
double[] array = new double[] { 1, 2, 3, 4 };
[Test]
public void HaveCorrectLength()
{
var indexer = new Indexer(array, 1, 2);
Assert.AreEqual(2,indexer.Length);
}
[Test]
public void GetCorrectly()
{
var indexer = new Indexer(array, 1, 2);
Assert.AreEqual(2, indexer[0]);
Assert.AreEqual(3, indexer[1]);
}
[Test]
public void SetCorrectly()
{
var indexer = new Indexer(array, 1, 2);
indexer[0] = 10;
Assert.AreEqual(10,array[1]);
}
[Test]
public void FailWithWrongArguments1()
{
Assert.Throws(typeof(ArgumentException), () => new Indexer(array, -1, 3));
}
[Test]
public void FailWithWrongArguments2()
{
Assert.Throws(typeof(ArgumentException), () => new Indexer(array, 1, -1));
}
[Test]
public void FailWithWrongArguments3()
{
Assert.Throws(typeof(ArgumentException), () => new Indexer(array, 1, 10));
}
[Test]
public void FailWithWrongIndexing1()
{
var indexer = new Indexer(array, 1, 2);
Assert.Throws(typeof(IndexOutOfRangeException), () => { var a = indexer[-1]; });
}
[Test]
public void FailWithWrongIndexing2()
{
var indexer = new Indexer(array, 1, 2);
Assert.Throws(typeof(IndexOutOfRangeException), () => { var a = indexer[10]; });
}
}public class Indexer
{
double[] arr;
int start;
public int Start
{
get { return start; }
set
{
if (value < 0) throw new ArgumentException();
if (value >= arr.Length) throw new ArgumentException();
start = value;
}
}
int length;
public int Length
{
get { return length; }
set
{
if (value < 0) throw new ArgumentException();
if (value > arr.Length) throw new ArgumentException();
length = value;
}
}
public Indexer(double[] arr,int start, int length)
{
this.arr = arr.Skip(start).Take(length).ToArray();
Start = start;
Length = length;
}
public double this[int index]
{
set
{
if ((index < 0) || (index >= Length)) throw new ArgumentOutOfRangeException();
arr[index] = value;
}
get
{
if ((index < 0) || (index >= Length)) throw new ArgumentOutOfRangeException();
return arr[index];
}
}
} [Test]
public void SetCorrectly()
{
var indexer = new Indexer(array, 1, 2);
indexer[0] = 10;
Assert.AreEqual(10,array[1]);
}ref здесь получается нельзя использовать и возврат и присвоение внешнему массиву измененного массива в каком-нибудь методе тоже нельзя. А нужно всё провернуть в конструкторе и индексаторе.
На всякий случай приведу ссылку на задание:
https://ulearn.me/Course/cs2/Praktik...a-985b6424cc64
Решение задачи: «Обертка над массивом double[]»
textual
Листинг программы
public Indexer(double[] arr,int start, int length)
{
//this.arr = arr.Skip(start).Take(length).ToArray();
this.arr = arr;
/* ... */
}